2013-05-12 70 views
1

我目前正在嘗試解決靜態初始化命令失敗。這是參考我以前的文章link。我有一個靜態方法來填充靜態容器的屬性。現在我的項目中的一個類有一個靜態屬性,它從該靜態方法中檢索一個值。問題是在啓動靜態方法之前調用該類的靜態屬性。我的問題是我該如何解決這個問題。 代碼示例如下解決靜態初始化命令失敗

//This is the code that has the static map container which is not initialized when 
//its queried by the OtherClass::mystring 
Header File 
class MyClass 
{ 
    static std::map<std::string,std::string> config_map; 
    static void SomeMethod(); 
}; 

Cpp File 
std::map<std::string,std::string> MyClass::config_map ; 

void MyClass::SomeMethod() 
{ 
... 
config_map.insert(std::pair<std::string,std::string>("dssd","Sdd")); //ERROR 
} 

給現在的一些方法正被稱爲以下移植

Header File 
    class OtherClass 
    { 
     static string mystring; 
    }; 

    Cpp File 
    std::string OtherClass::mystring = MyClass::config_map["something"]; // However config_map has not been initialized. 

誰能解釋一下什麼是最好的方法來解決這樣的慘敗?我做了一些閱讀,但我仍然無法理解它。任何建議或代碼示例肯定會被讚賞。

+0

在大多數情況下,使您的數據功能 - 靜態而不是類靜態應該可以解決問題。 – 2013-05-12 03:23:33

回答

1

聲明函數,並宣佈config_map爲靜態裏面

class MyClass { 
... 
    static std::map<std::string,std::string> & config_map() { 
    static std::map<std::string,std::string> map; 
    return map; 
    } 
}; 

void MyClass::SomeMethod() 
{ 
... 
config_map().insert(std::pair<std::string,std::string>("dssd","Sdd")); 
} 

std::string OtherClass::mystring = MyClass::config_map()["something"]; 

現在的地圖是保證被初始化。

+0

謝謝你的回答。爲了這個方法的工作,我還假設有一個靜態成員,比如'static std :: map config_map;' – MistyD 2013-05-12 03:25:39

+0

我從來沒有機會使用靜態局部變量。 – MistyD 2013-05-12 03:26:15

+1

你可以刪除靜態成員,只需使用這個函數來訪問'config_map'。 – yngccc 2013-05-12 03:27:27