簡體   English   中英

在類的靜態方法中訪問靜態成員變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM