[英]Accessing static member variable in a static method in class
我有一個程序,其中編寫了如下類:
.h文件
typedef map<string, int> stringMap;
class SampleClass{
public:
void setup();
void update();
void draw();
private:
static stringMap _someMap;
static stringMap someMapInitializer();
};
.cpp文件
//Initializer for static var
stringMap SampleClass::_someMap = someMapInitializer();
stringMap SampleClass::someMapInitializer(){
_someMap["something"] = 1;
return _someMap;
}
但是在執行上述操作時,我在運行程序時開始出現“程序收到信號EXC_BAD_ACCESS”錯誤(盡管編譯正常)
上面的功能更改為以下內容:
stringMap SampleClass::someMapIntializer(){
map<string, int> m;
m["somehting"] = 1;
return m;
}
工作正常。 第一種情況怎么了? 我不能在靜態函數中訪問靜態成員變量嗎?
在第一種情況下,您嘗試訪問應該初始化的對象(_someMap)。 _someMap尚未在此處初始化。
C ++保證在同一* .cpp文件中的任何其他函數被調用為main
中語句的(直接或間接)結果之前,具有靜態存儲持續時間的對象_someMap
將被初始化。
但是,初始化_someMap
的過程涉及調用函數_someMapInitializer()
。 如果該函數返回, _someMap
使用move構造函數或copy構造函數創建_someMap
,並傳遞返回的值。 但是_someMapInitializer()
然后嘗試在尚未構建的對象_someMap
上調用成員函數。 未定義的行為。
要解決此問題,我會設計得更像是...
class SampleClass {
//...
private:
static stringMap& someMap();
static void someMapInitializer(stringMap&);
};
stringMap& SampleClass::someMap() {
static bool init_done = false;
static stringMap the_map;
if (!init_done) {
someMapInitializer(the_map);
init_done = true;
}
return the_map;
}
void SampleClass::someMapInitializer(stringMap& the_map) {
the_map["something"] = 1;
}
這是“首次使用時構造”的成語。
現在,獲取地圖的唯一方法是調用函數someMap()
,在調用std::map
構造函數並將對象填充其初始數據之前,沒有任何東西可以意外使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.