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 呼び出しはありません)。間に)...どうすればこれが可能になりますか?どうすれば修正できますか?

4

1 に答える 1

3

静的な有効期間を持つ変数は、常にゼロで初期化されます。それらが含まれます:

  • 静的かどうかに関係なく、名前空間変数(グローバル名前空間を含む)。
  • ローカル静的変数。
  • メンバー静的変数。

ゼロ初期化は、それを単純にすることを意味します:

  • 数値タイプの場合:0
  • ブール値の場合:false
  • ポインタの場合:NULL
  • 列挙型の場合:0列挙型にキャスト
  • クラスタイプの場合:デフォルトで構築されます。

しかし、問題はそれに関係していません。変数が宣言されstaticており、ヘッダーファイルにあるため、それを含む各コンパイルユニット(.cppファイル)は、実際には変数の独自のインスタンスを認識します。ある.cppファイルから変更した場合、別のファイルからの変更は表示されません。

実行したいのはextern、.hファイルで変数を宣言してから、任意の.cppファイルで通常どおり(修飾子なしで)定義することです。

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

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

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

ところで、関数はより適切に宣言されてinlineいます。

于 2012-05-01T20:33:23.953 に答える