结构没有命名的成员

struct has no member named

本文关键字:成员 结构      更新时间:2023-10-16

我正在尝试制作一个跟踪节点数量的链表。我创建了一个静态变量numNodes,我在构造函数中增加它,并尝试在deleteNode()函数中减少它。但是,我得到以下错误:

quest.cpp: In member function 'void List::deleteNode()':
quest.cpp:25: error: 'struct List::node' has no member named 'numNodes'

这对普通变量很有效,但我似乎无法访问静态变量。我在这里读到,我需要用类似

的东西来声明变量
int node::numNodes = 0;

但是把它插入到程序中会出现其他错误。

第6行:

/tmp//ccrjmtbc.o: In function `List::deleteNode()':
quest.cpp:(.text._ZN4List10deleteNodeEv[List::deleteNode()]+0xe): undefined reference to `List::node::numNodes'
quest.cpp:(.text._ZN4List10deleteNodeEv[List::deleteNode()]+0x17): undefined reference to `List::node::numNodes'
collect2: ld returned 1 exit status

第29行:

quest.cpp:29: error: type 'List::node' is not derived from type 'List'

第32行:

quest.cpp: At global scope:
quest.cpp:32: error: 'int List::node::numNodes' is not a static member of 'struct List::node'

问题似乎是,我不知道如何访问静态变量时,它被封装在另一个结构体。我错过了什么明显的东西吗?有更好的方法吗?我需要在头文件中声明变量吗?(我是从Java转到c++的,不习惯这些东西。)

下面是代码(去掉不必要的杂乱):
#include <cstdlib>
struct List {
    struct node {
//     static int numNodes;   //Didn't work
       node() {
            static int numNodes = 0;
            numNodes++;
       }
    };
    node* nodePtr;
    List() {
        nodePtr = NULL;
    }
    void addNode() {
       node* n = new node;
       nodePtr = n;
    }
    void deleteNode() {
        nodePtr->numNodes--;
        delete nodePtr;
    }
//   int node::numNodes = 0;    //Didn't work
};
//int List::node::numNodes = 0;     //Didn't work
int main() {
    List MyList;
    MyList.addNode();
    MyList.deleteNode();
}

下面是你需要做的修改:

  1. 取消注释静态int numNodes;
  2. 删除静态int numNodes = 0;
  3. 取消注释你的底部尝试,int List::node::numNodes = 0;
  4. 确保初始化在cpp文件而不是头文件中结束。

那么它将工作良好。需要注意的是,静态numNodes除了作为调试助手之外没有任何实际用途。如果静态是你设计的核心部分,那么你可能走错了路。