C++ C+中的静态成员数组+;

C++ C+中的静态成员数组+;,c++,arrays,linker,static-members,C++,Arrays,Linker,Static Members,我在名为GTAODV的类中创建了一个静态成员数组 static int numdetections[MAXNODES]; 但是,当我尝试在类方法中访问此数组时(下面的示例) 为什么会发生这种情况?发生此错误时,很可能是您忘记定义静态成员。在类定义中假设这一点: GTAODV类{ 公众: 静态int numdetections[MAXNODES];//静态成员声明 [...] }; 在源文件中: int GTAODV::numdetections[]={0};//静态成员定义 注意类中声明之

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

static int numdetections[MAXNODES];
但是,当我尝试在类方法中访问此数组时(下面的示例)


为什么会发生这种情况?

发生此错误时,很可能是您忘记定义静态成员。在类定义中假设这一点:

GTAODV类{
公众:
静态int numdetections[MAXNODES];//静态成员声明
[...]
};
在源文件中:

int GTAODV::numdetections[]={0};//静态成员定义
注意类中声明之外的定义


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

,因为链接器不知道
numdetections的定义。您在哪里使用这个变量,定义在哪里?我在类GTAODV中定义了numdetections,并在GTOADV成员函数中使用它。请提供代码示例。您是否定义了
numdetections
?您说您在GTAODV类中定义了numdetections-实际上,您“声明”了它。缺少定义,这就是为什么会出现链接错误。此外,您编辑了原始问题,因此现在答案的上下文丢失。您必须将该定义放置在cpp文件中,以便仅定义一次。是的,这正是错误的原因。你能解释一下为什么会这样吗我认为在声明静态成员数组时,内存是分配给它的。我这样初始化静态成员值,但我不知道如何初始化静态成员数组。@ ZMCORKE感谢提示,做了一个编辑说明。除了声明之外,静态存储对象需要按照C++语言规范定义。注释显示哪些行是声明,哪些是定义。内存不是在声明中“分配”的,而是在定义中分配的。虽然“分配”有点误导,因为它不使用免费商店。
 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