2010-04-25 75 views
2

我想创建一个类,其中包含一个静态指针到它自己的一个实例。这里有一个例子:在C++中的同一类的静态成员变量

啊:

#include <iostream> 

#ifndef _A_H 
#define _A_H 

class A { 
static A * a; 
}; 

A * a = NULL; 

#endif 

然而,当我有啊在另一个文件中,如:

#include "A.h" 

class B { 

}; 

我收到以下错误:

ld: duplicate symbol _a in /Users/helixed/Desktop/Example/build/Example.build/Debug/Example.build/Objects-normal/x86_64/B.o and /Users/helixed/Desktop/Example/build/Example.build/Debug/Examplebuild/Objects-normal/x86_64/A.o 

我在Mac OS X Snow Leopard上使用Xcode默认编译器。

回答

5

这条线:

A * a = NULL; 

需要看起来像这样:

A *A::a = NULL; 

而且你需要把它搬出头文件,并把它放在一个源(的.cpp)文件。

静态成员的定义在程序中只能存在一次。如果您将此行放在头文件中,它将包含在每个包含它的源文件中,从而导致重复的符号错误。

+0

有道理。谢谢。 – LandonSchropp 2010-04-25 08:48:02

2

因为在A.cppB.cpp中都定义了全局变量a。一个公共符号只需要在一个地方定义。其余的可以通过链接知道该符号的内容。

A* a = NULL行从A.h移至A.cpp

(顺便说一句,指的a在类A,使用A* A::a = NULL;,否则你在全局命名空间创建一个a

+0

好的,我明白了。谢谢。 – LandonSchropp 2010-04-25 08:48:21