C++中的静态成员数组

vig*_*990 3 c++ arrays linker static-members

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

static int numdetections[MAXNODES];
Run Code Online (Sandbox Code Playgroud)

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

 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]);
Run Code Online (Sandbox Code Playgroud)

链接器在编译期间出错:

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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Seb*_*ler 13

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

class GTAODV {
public:
    static int numdetections[MAXNODES]; // static member declaration
    [...]
};
Run Code Online (Sandbox Code Playgroud)

在源文件中:

int GTAODV::numdetections[] = {0}; // static member definition
Run Code Online (Sandbox Code Playgroud)

请注意类中声明之外的定义.

编辑这应该回答关于"为什么"的问题:静态成员可以存在而不存在具体对象,即你可以在numdetections不实例化任何对象的情况下使用GTAODV.要启用此外部链接必须是可能的,因此必须存在静态变量的定义,以供参考:静态数据成员(仅限C++).

  • 您必须将该定义放在cpp文件中,以便它只定义一次. (2认同)
  • 根据C++语言规范,具有静态存储持续时间的对象除了声明之外还需要定义.注释显示哪些行是声明,哪一行是定义.内存未在声明中"分配",它在定义中分配.虽然"分配"有点误导,因为它不使用免费商店. (2认同)