2012-04-22 66 views
1

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

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 

为什么会这样:

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]); 

链接器在编译过程中给出了一个错误发生?

+3

因为你的链接器不知道'numdetections'的定义。你在哪里使用这个变量,定义在哪里? – 2012-04-22 16:52:31

+0

我已经在类GTAODV中定义了numdetections,并且我在GTOADV成员函数中使用它。 – vigs1990 2012-04-22 16:53:57

+0

请发布代码... – 2012-04-22 16:54:27

回答

10

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

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

在一个源文件:

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

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

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

+1

您必须将该定义放置在cpp文件中,以便仅定义一次。 – zmccord 2012-04-22 16:58:21

+0

是的,这正是错误的原因。你能解释为什么会发生这种情况吗? - 我认为内存是在声明时为静态成员数组分配的。我这样初始化静态成员值,但我不知道如何初始化一个静态成员数组。 – vigs1990 2012-04-22 17:03:30

+0

@zmccord感谢提示,作出澄清的编辑。 – 2012-04-22 17:05:30