我试图做一个链接列表,以跟踪节点的数量。我创建了一个静态变量numNodes
,我在构造函数中递增,并且我尝试在deleteNode()
函数中递减。不过,我得到以下错误:struct没有任何成员名为
quest.cpp: In member function 'void List::deleteNode()':
quest.cpp:25: error: 'struct List::node' has no member named 'numNodes'
这正常工作与普通变量,但我似乎无法访问静态的。我读here,我需要的东西来声明变量像
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();
}
不应该将numNodes作为整个列表的属性,而不是单个节点的属性? – Floris
好奇 - 如果你来自Java,那么你使用结构而不是类的原因是什么? –
为什么你想让numNode变成静态的?它不象每一个可能的名单将有相同数量的节点... – dragosht