结构没有命名的成员
struct has no member named
我正在尝试制作一个跟踪节点数量的链表。我创建了一个静态变量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();
}
下面是你需要做的修改:
- 取消注释静态int numNodes;
- 删除静态int numNodes = 0;
- 取消注释你的底部尝试,int List::node::numNodes = 0;
- 确保初始化在cpp文件而不是头文件中结束。
那么它将工作良好。需要注意的是,静态numNodes除了作为调试助手之外没有任何实际用途。如果静态是你设计的核心部分,那么你可能走错了路。
相关文章:
- 如何在C++中定义静态成员结构
- 使用模板化类的成员结构
- 初始化固定的 C 数组成员结构
- 指向成员结构的指针如何工作
- 如何将此“指针从外部类传递到成员结构
- 导致IAR ARM中出现错误的成员结构位字段元素的Initializer列表初始化
- 映射文件中成员结构的地址
- Visual C++ 模板类成员结构初始化语法糖
- C :初始化成员结构的静态字段的正确方法
- 如何在C 类的初始化器列表中使用未命名结构初始化成员结构
- 从成员结构的成员函数中访问类的成员?
- 模板化类的成员函数无法返回指向成员结构的指针?
- 重载非类型模板结构的成员结构的复制赋值运算符
- 灵气属性传播问题与单成员结构.
- 将具有 int* 成员C++结构编接到 C#
- 复杂的班级成员结构
- 将向量成员(结构)传递给函数
- 成员结构的前向声明
- 重载运算符<<用于模板结构中定义的成员结构
- 返回带有模板化类的类成员结构