2012-05-01 5 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は常にfalseです。

私はgetterとsetterをブレークポイントします(私はデバッグのためにそこにJavaがないことを知っています)、setterは変数をtrueに設定しますが、getAwarenessを呼び出すと、teamAwarenessはfalse (間にsetAwarenessコールはありません)...これはどのように可能ですか?どうすれば修正できますか?

+0

エラーを再現できません。私はセッターに与えたことに応じて、ゲッターから「真」または「偽」を得る。 – chrisaycock

+0

私はこのコードをエンジンの中で使っています。私はあまり知らないのですか?どのように私のコードを台無しにしていることを知っている方法はありますか?言い換えれば、変数が変わるたびにどのようにブレークポイントすることができますか? teamAwarenessへの唯一の参照はgetとsetです。これはまさに私が望むものです。 – Machinarius

+0

@Drknezz:多分問題は上記のコードではなく、あなたがそれを使う方法です。コードは私には大丈夫ですが、chrisaycockはそれをテストしたようです... – sergico

答えて

3

静的寿命を持つ変数は、常にゼロで初期化されます。これらは次のとおりです。

  • 名前空間変数(グローバル名前空間を含む)は、静的であるかどうかに関係なく使用できます。
  • ローカル静的変数。
  • メンバ静的変数。

ゼロ初期化が、それは簡単な作り、意味:

  • それが数値型の場合:0
  • それはブール値である場合:偽
  • それがポインタの場合:NULL
  • 列挙型の場合:0列挙型へのキャスト
  • クラス型の場合:デフォルトで構築されます。

しかし、あなたの問題は、それに関連していない、それは実際のそれ自身のインスタンスを見て含まれているあなたの変数がstatic宣言し、それがヘッダファイルになっているので、それがあるので、各コンパイル単位(.cppファイル)変数。 1つの.cppファイルから変更すると、別の.cppファイルから変更が表示されません。

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

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

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

はところで、機能がより良いinlineを宣言されている:あなたが何をしたいか

は、任意の.cppファイルに.hファイル内の変数externを宣言してから(修飾なし)通常、それを定義しています。

関連する問題