2014-06-13 62 views
0

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

不應該將numNodes作爲整個列表的屬性,而不是單個節點的屬性? – Floris

+0

好奇 - 如果你來自Java,那麼你使用結構而不是類的原因是什麼? –

+0

爲什麼你想讓numNode變成靜態的?它不象每一個可能的名單將有相同數量的節點... – dragosht

回答

0

這裏有您需要更改,使這項工作是什麼:

  1. 取消註釋static int numNodes; line top
  2. Remove static int numNodes = 0;在c'tor。
  3. 取消註釋您的底部嘗試,int List :: node :: numNodes = 0;
  4. 確保初始化以cpp文件而非標題結束。

然後它會正常工作。值得注意的是,除了調試助手之外,靜態numNodes不會起到任何實際的作用。如果這種靜態是你設計的核心部分,那麼你可能走錯了路。

+0

太棒了!這回答了問題並達到了預期的結果:在創建和刪除節點之後,「numNodes = 0」。我也想我明白爲什麼我的代碼現在不工作。 你能否解釋一下你的意思是「不會達到任何實際目的」?例如,這個設計似乎足以讓我在列表達到一定大小時提醒我。我想還有其他更好的方法可以做到這一點...... – user3736508

相關問題