c++ - 类成员函数无法访问同一类的私有(private)结构节点?

标签 c++ class declaration public-method

我正在做家庭作业,我偶然发现了一个障碍

我创建了一个看起来像这样的链表类

List.h
class List{
   struct Node{
       string data
       etc...
   }

   public:
       Node* lastNode(Node* root);
  List.cpp

  #include "List.h"

  List::Node* lastNode(Node* root){
      while(root && root->next){
          root = root->next;
      }
      return root;
  }


当我尝试运行代码时,它在此上下文中显示“struct List::Node 是私有(private)的”(从 List.cpp 中 lastNode 的函数头开始)

我不明白是什么原因造成的。我知道私有(private)字段只能被同一个类的成员函数访问,但是lastNode不是成员函数吗?

最佳答案

List::Node* lastNode(Node* root) { ... }

定义了一个名为 lastNode 的全局函数返回 List::Node* .您想将其定义为 List 的成员函数.为此,您只需限定名称 lastNodeList:: .
List::Node *List::lastNode(Node *root) { ... } // * placement is more idiomatic this way

第二个List:: ,在函数名上,声明该函数“属于”List ,所以第二个 Node ,在它之后,不需要由 List:: 限定。再次。返回类型,因为它位于 List:: 之前在最后一个节点上,仍然在全局范围内解释,因此您需要对其进行限定。我认为除了历史惯性之外没有任何充分的理由,这是从编译器愚蠢到对此感到困惑时的遗留物。您还可以将返回类型放在限定函数名称之后,您可以在此处省略限定符:
auto List::lastNode(Node *root) -> Node* { ... }

Godbolt

关于c++ - 类成员函数无法访问同一类的私有(private)结构节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59815790/

相关文章:

c# - 如何获取有关 IDispatch COM 接口(interface)故障的更多调试信息

c++ - 输入流失败后对输入变量的影响

执行字符串分配时 C++ 程序崩溃

Java:什么时候使用属性,什么时候使用方法参数?

haskell - GHCi 提示符下的声明

c++ - 仅对 C++ 中的空私有(private)构造函数使用声明是否正确?

c++ - 用右值构造一对

c++ - 如何使用 POCO 获取应用程序文件名,如 GetModuleFileName (Win32 API)

java - 第一次请求的 servlet 响应时间很慢

c++ - C++中的抽象类声明