2011-08-24 55 views
1

假設我有一個名爲Poem的類。在main()之前註冊類/函數/東西

class Poem{ 
    virtual void recite() = 0; 
} 

而且我有上百個,其描述了一個子類的.cpp和.HPP文件,如以下

class TheRaven : public Poem{ 
    void recite() { std::cout << "NEVERMORE!" << endl; } 
} 

和喜歡。在主函數中,我希望能夠遍歷每一個可能的Poem子類並調用它們的recite()函數。所以我做了一個類:

class PoemRegistry{ 
    std::map<std::string, Poem*> poems; 
    PoemRegistry& getGlobal(); // returns a static global registry 
    void register(const std::string& poemname, Poem * thepoem); 
}; 

然後爲每個詩的子類.cpp文件,我把以下內容。

class TheRavenRegistor{ 
    TheRavenRegistor(){ 
     PoemRegistry::getGlobal().register("theraven", new TheRaven()); 
    } 
} 
TheRavenRegistor registor(); 

忍者編輯:我把全球一流那裏,忘記了它

因此很容易,我就與#define和模板的快捷方式。

現在,問題是,我剛剛聽說靜態類初始化失敗。我想這會對它免疫,或者我在這裏肯定缺少什麼?還是有更優雅的東西可以用於這個目的?

+0

的目的是什麼?你想爲'main()'之前初始化的每個全局對象調用'recite()'嗎? – iammilind

+0

什麼時候'TheRavenRegistor'被實例化? –

+0

上面的代碼中缺少某些內容,因爲沒有任何內容需要靜態初始化。 –

回答

1

這是單例設計模式的示例。不要使用靜態全局變量,因爲初始化順序在編譯單元中未定義。 而是使用這樣的事情:

充分利用getGlobal()方法static

class PoemRegistry 
{ 
public: 
    static PoemRegistry& getGlobal(); 
... 
+0

謝謝,忘了關於靜態關鍵字,但這是主意。 – kamziro

相關問題