2010-07-21 92 views
1

使用靜態成員(它是頭中的另一個類)聲明類時是否存在任何問題?例如:被聲明爲靜態類成員的C++類

class Stat 
{ 
public: 
    int avar; 
    Stat(); 
}; 

class Test 
{ 
public: 
    static Stat stat; 
}; 

我擔心它可能會導致問題的原因是,它似乎非常類似於在頭中聲明全局變量。如果包含在兩個cpp文件中,則會在兩個文件中聲明全局,從而導致錯誤。

上面例子中的'stat'仍然需要在兩個cpp文件之間創建一次,這與全局相同,所以編譯器如何處理一種情況而不是另一種,或者它不能做到的答案?

+1

這些__CLASS定義,不declarations__。 'Test :: stat',無論如何,只是一個__member聲明___,仍然需要定義。 (見[這個答案](http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632)什麼是聲明和定義C++。) – sbi 2010-07-21 11:18:13

回答

4

的答案是,你在聲明靜態的(像你可以聲明一個全球)。 但你應該只在cpp文件中定義它。

在.h:

extern int myGlobal; 
class A 
{ 
    static int myStaticMember; 
}; 

在一個.cpp:

int myGlobal = 42; 
int A::myStaticMember = 42; 
+0

我想你的意思是'A :: myStaticMember' – Gianluca 2010-07-21 12:03:51

+0

謝謝,編輯。 – Scharron 2010-07-21 12:15:29

4

你只聲明在類中類的靜態成員變量,你必須它分別在CPP文件中定義

Stat Test::stat; 

所以沒有編譯器或鏈接錯誤。頭文件中的聲明只是指cpp文件中的定義。

在全局變量而言,該聲明等同於:

extern int global; 

而且定義等同於:

int global;