Объявление переменной в, если еще блок в C++

Существует также Structure101, который должен сделать это.

6
задан blcArmadillo 24 November 2009 в 23:57
поделиться

6 ответов

Ваша проблема в том, что player выпадает из области видимости в каждом блоке if / else if.

Вам необходимо объявить свою переменную над всеми операторами if.

Но вы не можете использовать для этого ссылку, потому что вы должны сразу же инициализировать ссылку.

Вместо этого вы, вероятно, захотите что-то вроде этого:

int main(int argc, char *argv[]) {

    Player * pPlayer = NULL;
    if (argv[3] == string("simple")) {
        pPlayer = get_Simple();
    } else if (argv[3] == string("counting")) {
        pPlayer = get_Counting();
    } else if (argv[3] == string("competitor")) {
        pPlayer = get_Competitor();
    }

    //Then if you really want to...
    Player &player = *pPlayer;

}
21
ответ дан 8 December 2019 в 02:14
поделиться

Другие предлагали указатели. Однако можно также использовать условный оператор.

Player & player = argv[3] == string("simple") ? get_Simple()
                : argv[3] == string("counting") ? get_Counting() 
                : get_Competitor(); 
17
ответ дан 8 December 2019 в 02:14
поделиться

Вы объявили три отдельные переменные player в трех разных областях видимости, и сообщение об ошибке говорит именно то, что это означает.

Вам необходимо объявить одного игрока переменная вне if -условия и присвоить результат. Это сложно, поскольку player является ссылкой - вы должны инициализировать его один раз.

Вы можете поместить if -запись в функцию (скажем, GetPlayer () ), которая возвращает указатель на объект, а затем инициализируйте проигрыватель с помощью * GetPlayer ().

2
ответ дан 8 December 2019 в 02:14
поделиться

В

if (argv[3] == string("simple")) {
    Player & player = *get_Simple();
} 

Переменная существует только между {} . Когда вы дойдете до } , переменная не использовалась и будет отброшена, так как никогда не использовалась.

0
ответ дан 8 December 2019 в 02:14
поделиться

Если вы поместите статическую переменную внутрь области видимости, разделенную {} , то эта переменная больше не будет доступна, когда область действия закончится.

Попробуйте это вместо этого:

int main(int argc, char *argv[]) {

    // TODO: validate argc and argv here
    if (argc < 3) {
        printf("error: not enough arguments\n");
        exit(1);
    }

    Player* player_ptr = NULL;
    if (argv[3] == string("simple")) {
        player_ptr = get_Simple();
    } else if (argv[3] == string("counting")) {
        player_ptr = get_Counting();
    } else if (argv[3] == string("competitor")) {
        player_ptr = get_Competitor();
    }

    if (!player_ptr) {
        printf("error: invalid argument %s\n", argv[3]);
        exit(1);
    }

    Player& player = *player_ptr;

    // More code
}
3
ответ дан 8 December 2019 в 02:14
поделиться
#include <map>

int main(int argc, char **argv)
{
    typedef std::map<std::string, Player*(*)()> lookup;
    lookup mapping;

    mapping["simple"] = get_Simple;
    mapping["counting"] = get_Counting;
    mapping["competitor"] = get_Competitor;

    lookup::const_iterator it = mapping.find(argv[3]);
    if (it == mapping.end())
    {
        std::cout << "illegal argument\n";
    }
    else
    {
        Player& player = *it->second();
        // more code
    }
}
0
ответ дан 8 December 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: