0

私はC++でプログラミングしていて、静的変数を使用するメソッドがあります。この方法は、私が思うように機能していません。調査したところ、静的変数が2つの場所で赤で強調表示され、他の場所で青で強調表示されていることがわかりました。以下はコードです:

int GameModeState::changeJob(int number)
{
    static int job = 1; //red
    if (number == 1)
    {
        job = (job+1); //First one is red, second one is blue
        return job; //blue
    } else {
        return job; //blue
    }
}

このメソッドを他のメソッドで呼び出しています。たとえば、次のようになります。

int GameModeState::getJob()
{
    int currentJob = (changeJob(2));
    return currentJob;
}

getJob()単純に現在の値を返すようなメソッドが必要ですがjob、changeJob(number)を呼び出すときに別のメソッドがである場合はchangeJob(1)、ジョブの値を1つインクリメントします。(したがって、のif / elseステートメントchangeJob(number))。変数の強調表示が異なるためjob、コンパイラーは2つを別々に表示していると言っていると思いますか?私はjobいくつかの均等な価値で立ち往生しています。

編集私もAwesomiumを持っています...コンパイラへの唯一の追加だと思いますが、完全にはわかりません。

MOAR EDIT別のクラスでは、現在のジョブの数を判別し、その数が偶数か奇数かに基づいて何かを実行するメソッドがあります(現在は2つのジョブしかないため)

void ZoneMovementState::_changeZone(const String& message, const Awesomium::JSValue& input, Awesomium::JSValue& output)
{
    //Awesomium::JSValue::Object object = input.getObject();
    //String zoneFilename = Convert::toString(object[L"zoneFilename"].toString());

    // If the number from getJob is even, the player is currently a geologist
    if (GameModeState::getJob()%2 == 0)
    {
        ZoneParser::getSingleton().load("../media/zones/geology_zone.xml", false);
    } else {
        ZoneParser::getSingleton().load("../media/zones/farm_zone.xml", false);
    }
    transitionHandler->go();
}

コメント付きの2行は無視してください。彼らは私が今は取り組んでいないJSを扱っています。プログラムではfarm_zone、次のメソッドを使用してジョブの値をインクリメントするまでにアクセスできGameModeStateます。

    void GameModeState::_openNotebook(const String& message, const Awesomium::JSValue& input, Awesomium::JSValue& output)
{
    mNotebookTransition->go();
    static int currentJob = changeJob(1);
}

....それで私は自分の問題を理解しました。皆さんに見せるためにコードを調べているうちに、静的なforcurrentJobはおそらく不要であることに気付きました...一度削除すると、コードは正常に機能するようになります。

助けてくれてありがとう!

4

2 に答える 2

1

ここでの問題の一部は、静的ローカルを使用していることです。これは、メンバー変数である可能性が非常に高いためです。静的ローカルは、プロセス内のすべてのスレッドの関数へのすべての呼び出しにわたってその値を維持します。changeJob特定のインスタンスへのすべての呼び出しに対してそれを持続させたい可能性がはるかに高くなりGameModeStateます(そうでない場合は、そもそもなぜそれをメンバー関数にするのですか?)。

これを行うには、コンストラクターで初期化するときにメンバー変数を定義してGameModeStateから、メソッドでそれにアクセスする必要があります。例えば

class GameModeState {
  int job;
  GameModeState() : job(1) {} 
  int changeJob(int number);
};

int GameModeState::changeJob(int number) {
    if (number == 1) {
        job = (job+1);
        return job;
    } else {
        return job;
    }
}

注:なぜあなたが見ている色をあなたが見ているのか完全にはわかりません。Visual Studioは、デフォルトではメンバー変数をC ++の特定の色に色付けしないため、使用している別のアドインである可能性が非常に高くなります。

于 2011-04-08T14:54:42.120 に答える
0

いや、ハイライトは何の意味もありません。つまり、エディターは、強調表示する方法/内容/タイミングを決定する前にコンパイラーを呼び出しません。だからそれはあなたの問題ではありません。申し訳ありません'試合それ:-)

[ツール]->[オプション]->[テキストエディター]に移動し、別のテキスト編集モデルを選択して強調表示を変更できることに気付くと、これを証明できます。

于 2011-04-08T14:53:29.800 に答える