Компилятор Visual Studio подсвечивает статические переменные по-разному? - PullRequest
0 голосов
/ 08 апреля 2011

Я программирую на 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 (число) равен changeJob(1), чтобы увеличить значение задания на единицу.(Следовательно, оператор if / else в changeJob(number)).Поскольку переменные job подсвечиваются по-разному, я думаю, что компилятор говорит, что он как-то просматривает два отдельно?Я застреваю с job, являющимся некоторым четным значением.

EDIT У меня также есть 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);
}

.... Итак, я решил свою проблему.Проходя через код, чтобы показать вам, ребята, я понял, что статика для currentJob, вероятно, была ненужной ... как только я удалил ее, мой код работает, как и сейчас.

Спасибо за помощь, ребята!

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Часть проблемы здесь заключается в том, что вы используете статический локальный код, который, скорее всего, должен быть просто переменной-членом.Статический локальный поддерживает свое значение во всех вызовах функции во всех потоках в процессе.Гораздо более вероятно, что вы хотите, чтобы он сохранялся при всех вызовах 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 ++, поэтому вполне вероятно, что вы используете другую надстройку.

0 голосов
/ 08 апреля 2011

Нет, выделение ничего не значит. То есть редактор не вызывает компилятор, прежде чем решить, как / что / когда выделять. Так что это не ваша проблема. Извините, что: -)

Вы можете доказать это себе, перейдя в Инструменты-> Параметры-> TextEditor и заметив, что вы можете изменить выделение, выбрав другую модель редактирования текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...