2010-05-17 49 views
-1
class B { 
public: 
    static int a; 
}; 
class C:B { 
}; 

我想通過任何繼承的類使用變量,但是當我聲明一個類時它有問題。如何:繼承類中的靜態變量

B::B() { 
    a=1; 
}; 

我做對了嗎?
感謝您閱讀並等待您的意見。

//我錯過了分號,這不是我說的錯誤。 //這是我嘗試delcare時發生的錯誤 class GameState { public: static int a = 1; // ... };

Error 7 error C2864: 'CGameState::a' : only static const integral data members can be initialized within a class d:\my dropbox\work\#today\gdimario\gdimario\gamestate.h 18 

我試着寫一個簡單的問題,它顯示了我想要的問題,而不是粘貼我的整個代碼。

+1

什麼問題? , 如果我可以問。 – 2010-05-17 15:15:29

+1

你的錯誤意味着你正試圖初始化類聲明中的靜態成員(即你有'static int a = 123;')。你只能這樣做,如果它也是'const'。 – Inverse 2010-05-17 16:46:37

+0

@Inverse:Thanks :) – nXqd 2010-05-17 17:55:10

回答

5

您可以像派生類和基類一樣直接使用它。

也許你的錯誤是你的類聲明結尾沒有分號?

class B { 
public: 
    static int a; 
}; 

class C:B { 
}; 

如果你想從一個C的實例調用它,那麼你需要使用公有繼承(如果指定私有繼承假設沒有)

class C : public B { 
}; 

要初始化你需要做的這個(通常在你相應的.cpp文件中的頂部):

int B::a = 3; 
+0

它不應該是'C :: B'嗎? – ereOn 2010-05-17 15:31:38

+0

@ereOn:你的意思是? – 2010-05-17 18:21:21

+0

沒關係......睡不夠;) – ereOn 2010-05-18 06:32:29

3

您需要在CPP文件中寫入:

int B::a; 

並添加Brad建議的分號。 (你甚至編譯過你的代碼嗎?編譯器說了什麼?)

+0

他真的可以在班**定義**中寫這個嗎? 'a'不是'const',只是'static'。 – ereOn 2010-05-17 15:21:51

+0

@ereOn我不確定,但我認爲初始化部分是因爲成員變量是靜態的 - 不僅是常量。 – 2010-05-17 15:25:52

+1

@ereOn是「static int a = 1;」只是給它一個初始值。它不是「常量」的事實意味着價值可以稍後改變。 – eemz 2010-05-17 15:44:45

0

我想你會得到鏈接錯誤。因爲您尚未在.cpp文件中定義靜態變量,因此請使用以下代碼: 。

e.g. 

//hearer file 
class X{ 

public : static int a ; 

} 
//impl file 

int X::a(0); 

....或...

對於你也可以定義靜態變量整體式的時候都宣稱像:

類X {

public : static int a = 0; 

} 
+1

只有'const'靜態成員可以直接在類定義中提供一個初始化器。另外,即使它有一個初始化器,它仍然不是一個定義。 – AnT 2010-05-17 16:14:11