2010-04-25 71 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