2011-10-01 23 views
1

我有一個類用於存儲我創建的視覺實驗的一些靜態默認變量。用作常量的靜態變量在其他類中返回零

它們沒有標記爲const,因爲我在運行時使用GUI來調整它們。 當我將它們記錄在主類(它調用Defaults類的靜態函數init)時 - 它們是有效的。但是在不同類的構造函數中它返回零。

輸出看起來像這樣

"Constants::init() called" // Constants::Heads::MIN_LIFETIME initialized to 1200 
preSetup-Log Constants::Heads::MIN_LIFETIME 1200 
PhysicsObject- Constants::Heads::MIN_LIFETIME 0 // Y you zero? 
postSetup-Log Constants::Heads::MIN_LIFETIME 1200 

我定義這樣的常量:

namespace Constants { 
    namespace Forces { 
     static int MAX_LIFETIME; 
     static float GRAVITY_FORCE; 
    }; 
} 


static void init() { 
    std::cout << "Constants::init()" << std::endl; 
    Constants::Forces::GRAVITY_FORCE = 40000.0f; 
    Constants::Forces::MAX_LIFETIME = 3000; 
} 
+0

你可以發佈重現錯誤的最小代碼嗎? – Beta

+0

你可以顯示你的程序中的一些代碼嗎? – SpeedBirdNine

+0

請發佈.h和.cc文件的相關部分。 –

回答

3
// header.h 
namespace Constants { 
    namespace Forces { 
    extern int MAX_LIFETIME; 
    extern float GRAVITY_FORCE; 
    } 
} 

// my_constants.cpp 
namespace Constants { 
    namespace Forces { 
     int MAX_LIFETIME = 3000; 
     float GRAVITY_FORCE = 40000.0f; 
    } 
} 

然後在使用常量的文件中包含header.h。常量將在程序啓動時自動初始化。

4

這是因爲當你聲明一個變量static一個(比如說.h)文件中,包括該文件在各種.cpp文件中,然後對於每個.cpp文件(翻譯單元)的,變量的單獨副本被創建爲。例如,

// x.h ... 
    namespace Forces { 
     static int MAX_LIFETIME; // unique copy for each translation unit (.cpp) 
     static float GRAVITY_FORCE; // same as above 

     extern int SOMETHING; //<----- creates only single copy 
    }; 

如圖所示,您應創建變量externnamespace內,僅在.cpp文件之一定義變量。

其他方式是將它們封閉內部的class代替namespace

class Forces { 
    static int MAX_LIFETIME; // only 1 copy 
    static float GRAVITY_FORCE; // only 1 copy 
}; 

你仍然有在.cpp文件作爲一個定義它們,

int Forces::MAX_LIFETIME = <>; 
+0

因此,爲了實現我的目標,有什麼可能是實現它的好方法。如果可能的話,我寧願不要有extern。 – 1dayitwillmake

+1

@ user4683:你對externs有什麼異議? –

+0

@ user4683,請參閱編輯答案。 – iammilind

相關問題