0

我正在用 C++ 编程,并且有一个使用静态变量的方法。该方法没有按我认为的那样工作;经过调查,我发现我的静态变量在两个地方以红色突出显示,在其他地方以蓝色突出显示。下面是代码:

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) ischangeJob(1)时,将作业的值加一。(因此是 if/else 中的语句changeJob(number))。由于job变量的突出显示方式不同,我认为编译器是在说它以某种方式分别查看两者?我被困job在了一些平均价值上。

编辑我也有 Awesomium ......我相信这是编译器的唯一补充,但我不完全确定。

MOAR EDIT在另一堂课中,我有一个方法应该确定当前工作的编号,并根据该数字是偶数还是奇数做一些事情(因为现在只有两个工作)

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();
}

忽略两个注释掉的行;他们处理 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

不,突出显示没有任何意义。也就是说,编辑器在决定如何/什么/何时突出显示之前不会调用编译器。所以这不是你的问题。对不起'回合:-)

您可以通过转到 Tools->Options->TextEditor 并注意您可以通过选择不同的文本编辑模型来更改突出显示来向自己证明这一点。

于 2011-04-08T14:53:29.800 回答