2012-12-16 36 views
0

我有這個類:如何創建一個初始化函數,只有在C++中讀取一次

class A : public B 

,我需要補充一些受保護的領域:_field,在A和我不能觸摸/變化B. 現在,除了構造函數之外,B和A中的所有函數都是虛擬的。顯然,_field不屬於B類的一部分。

我需要初始化_field。我該怎麼做,如果唯一的構造函數是B的? 此外,這樣的事情:

unsigned long _field = 0; 

給我一個錯誤的編譯。

我解決這個問題的:

class A : public B 
{ 
protected: 
    unsigned long _field; 
public: 
    void fooFunction(){ 
    ....do other stuff.... 
    static bool isInitField = false; 
    if (!isInitField){ 
     _field = 0; 
     isInitField = true; 
    } 
    ...rest of the function... 
    } 

有沒有更好的方式來做到這一點,而不使用靜態的?

感謝, 或者

+1

爲什麼不使用A的構造函數? –

+1

既然從B繼承了A? – inf

回答

2

使用構造和B鍵構造函數初始化列表中,這樣你初始化類A的各個領域:

A(unsigned long i, other_paramaters oth) : B(oth),_field(i) { 

} 
1

原諒我的,其實我沒有理解你的問題。就一次初始化而言,構造函數是做這件事的地方。但是你提出的解決方案暗示你想要別的東西。

靜態函數定義會使_field在類的所有對象中只有一次可修改,這是使_field一次可修改的有點尷尬的機制。

如果您只想初始化_field,然後使用初始化。 Esteban的解決方案可以。更好的使用

A(無符號長I,other_paramaters OTH):B(OTH),_字段(I){ }

A(PARAMS):B(PARAMS),_字段(0 ){}

相關問題