簡體   English   中英

在C ++中聲明if-else塊中的變量

[英]Declaring a variable in an if-else block in C++

我試圖在if-else塊中聲明一個變量,如下所示:

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

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

    // More code
}

但是,當我嘗試編譯時,我遇到以下錯誤:

driver.cpp:38:錯誤:未使用的變量'player'
driver.cpp:40:錯誤:未使用的變量'player'
driver.cpp:42:錯誤:未使用的變量'player'
driver.cpp:45:錯誤:未在此范圍內聲明'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;

}

其他人提出了建議。 但是,也可以使用條件運算符。

Player & player = argv[3] == string("simple") ? get_Simple()
                : argv[3] == string("counting") ? get_Counting() 
                : get_Competitor(); 

如果將靜態變量放在作用域內,由{ }分隔,那么當作用域結束時該變量將不再可用。

試試這個:

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
}

您已經在三個不同的范圍中聲明了三個單獨的player變量,並且錯誤消息正確地說明了它的含義。

您需要在if -statement之外聲明單個player變量並分配結果。 這很棘手,因為玩家是一個參考 - 你必須初始化一次。

您可以將if -statement放在一個返回指向對象的指針的函數(比如GetPlayer() )中,然后用* GetPlayer()初始化播放器。

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

該變量僅存在於{}之間。 當你到達} ,變量沒有被使用,將被丟棄,從未被使用過。

#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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM