我試圖做一個鏈接列表,以跟蹤節點的數量。我創建了一個靜態變量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