C ++中的静态成员数组

时间:2012-04-22 16:49:24

标签: c++ arrays linker static-members

我在名为GTAODV的类中创建了一个静态成员数组。

static int numdetections[MAXNODES];

但是,当我尝试在类方法(下面的例子)中访问这个数组时,

 numdetections[nb->nb_addr]++;
 for(int i=0; i<MAXNODES; i++) if (numdetections[i] != 0) printf("Number of detections of %d = %d\n", i, numdetections[i]);

链接器在编译期间出错:

gtaodv/gtaodv.o: In function `GTAODV::command(int, char const* const*)':
gtaodv.cc:(.text+0xbe): undefined reference to `GTAODV::numdetections'
gtaodv.cc:(.text+0xcc): undefined reference to `GTAODV::numdetections'
gtaodv/gtaodv.o: In function `GTAODV::check_malicious(GTAODV_Neighbor*)':
gtaodv.cc:(.text+0x326c): undefined reference to `GTAODV::numdetections'
gtaodv.cc:(.text+0x3276): undefined reference to `GTAODV::numdetections'
collect2: ld returned 1 exit status

为什么会这样?

1 个答案:

答案 0 :(得分:12)

发生此错误时,您很可能忘记定义静态成员。假设这在你的班级定义中:

class GTAODV {
public:
    static int numdetections[MAXNODES]; // static member declaration
    [...]
};

在源文件中:

int GTAODV::numdetections[] = {0}; // static member definition

注意类中声明之外的定义。

编辑这应该回答有关“为什么”的问题:静态成员可以在没有具体对象的情况下存在,i。即您可以使用numdetections而无需实例化GTAODV任何对象。要启用此外部链接,必须存在静态变量的定义,以供参考:Static data members (C++ only)