2012-12-16 54 views
1

我有一個抽象基類,它用於派生一些類。 這些類的一些屬性在所有類中共享,並且這些屬性應該是不可修改的。抽象基類中的靜態常量變量

爲了讓所有10個類共享一個變量,我將它變成靜態的。

class ABC{ 
public: 
    static int *anArray; 
    int index; 
    static int tot_index; 
    virtual void print()=0; 
    ABC(){index=tot_index++;}; 
    virtual ~ABC(){}; 
}; 

這工作得很好,tot_index將包含實例化類的數量,並且該指數爲每個類的獨特indentifier。

我遇到的問題是* anArray和派生類的數量是在運行時設置的,在類實例化之後,我不想修改這些值。

我升技迷惑不解:

1)我應該在哪裏設置* anArray價值?只是在派生類的一些隨機?

2)如果一個變量應該是不可修改的,那麼我應該將它設置爲const。但是如果我不知道編譯時的值是什麼,我該如何將它設置爲const?

+0

什麼是你正在試圖解決的根本問題?這很可能是一個更好的設計模式。 – Johnsyweb

+0

如果你定義了tot_index常量,你將無法做到tot_index ++。 –

+1

對於靜態變量,您正在尋求麻煩。在C++中有一個叫做靜態初始化順序失敗(SIOF)的令人討厭的事情。正如同事們所說,這種設計看起來不太好。我不知道你想實現什麼,但是如果你想要的只是註冊基類的實例,可以考慮爲此使用單獨的對象。無論如何,請閱讀有關如何避免SIOF的C++常見問題解答。 – doc

回答

1

而不是使用靜態變量有一些模式可以實現這一點。

最簡單的實現,雖然不是最好的原因很多,但將共享變量放在一個單一的基類(ref:GoF Singleton模式)中。

另一個更漂亮的解決方案可能是一些工廠模式,例如GoF Abstract Factory。

編輯: 此外,對於文檔的評論,請參閱:http://www.parashift.com/c++-faq/static-init-order-on-first-use.html

:)