2014-06-13 133 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

相关问题