2012-05-01 73 views
0

下面的代碼有問題:名稱空間上的變量是否總是有默認值?

#ifndef _ALTERFPS_H 
#define _ALTERFPS_H 

#include "HUDLuaFunctions.h" 
#include "AlterFPSNodes.h" 

namespace AlterFPS 
{ 
    namespace Globals 
    { 
     static bool teamAwareness; 
     static int teams[] = {0, 0}; 

     static bool getAwareness() { 
      return teamAwareness;  
     } 

     static void setAwareness(bool aware) { 
      teamAwareness = aware; 
     } 
    } 
} 

#endif 

問題是teamAwareness始終是假的。 (我知道這不是Java),並發現setter的確將變量設置爲true,但隨後對getAwareness的調用顯示teamAwareness爲false (沒有setAwareness之間的電話)...這怎麼可能?我如何解決它?

+0

我無法重現您的錯誤。我從getter獲得'true'或'false',這取決於我給定的setter。 – chrisaycock

+0

我在引擎中使用這段代碼,我不太瞭解?有什麼辦法可以知道所說的引擎搞亂了我的代碼嗎?換句話說,當變量發生變化時,我該如何斷點? teamAwareness的唯一引用是get和set,這正是我想要的。 – Machinarius

+0

@Drknezz:也許問題不在於上述代碼,而在於您使用它的方式。代碼對我來說看起來不錯,chrisaycock似乎已經測試過它... – sergico

回答

3

靜態生命期變量始終爲零初始化。這些包括:

  • 命名空間變量(包括全局命名空間),無論它是否爲靜態。
  • 本地靜態變量。
  • 成員靜態變量。

零初始化,使其成爲簡單,是指:

  • 如果它是數字型的:0
  • 如果是布爾:假
  • 如果是指針:NULL
  • 如果它是枚舉:0強制轉換爲枚舉類型
  • 如果它是類類型:default構造。

但你的問題是不相關的是,那是因爲你的變量聲明static,它是在頭文件,以便包括它實際上每個編譯單元(.cpp文件)認爲它的自己的實例變量。如果您從一個.cpp文件更改它,您將看不到另一個。

你想要做的是在.h文件中聲明變量extern,然後通常把它定義(沒有修改)在任何.cpp文件:

//.h file 
namespace Globals 
{ 
    extern bool teamAwareness; 

    inline void setAwareness(bool aware) { 
     teamAwareness = aware; 
    } 
} 

//.cpp file 
namespace Globals 
{ 
    bool teamAwareness; 
} 

BTW,功能更好的聲明inline