C ++ предупреждение C4800 - 'int' заставляет значение bool 'true' или 'false' с помощью оператора switch - PullRequest
0 голосов
/ 27 марта 2011

В этом сегменте кода toPurchase преобразуется из целого числа в логическое значение, когда он инициализируется с player->giveOptions() (который возвращает целое число, а не логическое значение) в самом конце этого кода. После этого появляется switch(toPurchase), который, как говорит компилятор, не будет работать, потому что toPurchase был преобразован в bool. Почему?

int loc = player->giveOptions(4,"Trainers","Market","Inn","Back","");
    int chos;
    bool success = true;
    bool toPurchase = false;
    switch(loc){
    case 1:
        text.push_back("Hello, "+player->name+".");
        if (player->firstTrainerVisit){
            text.push_back("I'm not sure if anyone's told you, but there's been some strange talk about you lately...");
            text.push_back("Hmm... A lot of people are scared of you.");
            text.push_back("Anyway, nice to meet you. I'm Yobbee, the village trainer.");
            text.push_back("You'll need training up before meeting the village elders.");
            text.push_back("Usually, you need to pay to get trained by me, but as a first time bonus I'll teach you for free.");
            text.push_back("After you've been trained, you get a skill point, which you can use to increase one of your abilities.");
        }
        text.push_back("Would you like to be trained today?");
        NPCTalk("Yobbee (Trainer)",text);
        text.clear();
        chos = player->giveOptions(2,"Yes","No","","","");
        switch(chos){
        case 1:
            if(!player->firstTrainerVisit){
                cout << "This will cost 10 gold. Continue?" << endl;
                int purchase = player->giveOptions(2,"Yes","No","","","");
                if(purchase)
                    success = player->spendGold(5);
                else
                    success = false;
            }
            if (success){
                player->awardStat(1,"sp");
                cout << "After a day of vigorous training, you find your skills honed." << endl;
            }else{
                cout << "You don't have enough gold!" << endl;
            }
            if(player->firstTrainerVisit&&success){
                text.push_back("You can use your skill point to increase one of your stats by typing 'sp' any time you are given a choice.");
                text.push_back("There are other commands you can use at any choice opportunity as well - just type 'help' to see this one and others.");
                NPCTalk("Yobbee (Trainer)",text);
                text.clear();
                player->firstTrainerVisit = false;
            }
            break;
        case 2:
            break;
        }
        cout << "\nBack to the entrance to Poglathon..." << endl;
        system("PAUSE");
        Poglathon(text,player);
        break;
    case 2:
        if(player->firstMarketVisit){
            text.push_back("Oh... Hello, "+player->name+".");
            text.push_back("Ignore other people's looks. You'll find out about all this when you meet the Elders.");
            if(!player->firstElderVisit) text.push_back("Oh, you have already? Then I don't feel guilty about not explaining.");
            text.push_back("Here, at the market, you can buy new equipment for your travels, such as food, weapons and armour.");
            text.push_back("You don't have any gold at the moment, but as a standard first-time visit we will issue you with some leather armour and a rusty dagger.");
            text.push_back("Not the best of items, but it'll certainly help!");
            text.push_back("The weapon and armour are now in your backpack. To equip items in your backpack, when you are given an option type 'backpack'.");
            player->addToBackpackIfSpace("Rusty dagger");
            player->addToBackpackIfSpace("Leather armour");
            NPCTalk("Market Manager",text);
            text.clear();
            player->firstMarketVisit = false;
        }
        cout << "Do you want to purchase anything at the market?" << endl;
        toPurchase = player->giveOptions(2,"Yes","No","","","");
        switch(toPurchase){
        case 1:
            cout << "You can't purchase anything yet. NOOB" << endl;
            break;
        case 2:
            break;
        }
        cout << "\nBack to the entrance to Poglathon..." << endl;
        system("PAUSE");
        Poglathon(text,player);
        break;
    }

Ответы [ 3 ]

2 голосов
/ 27 марта 2011

вы включаете toPurchase, что фактически является логическим значением (объявлено как логическое значение в строке 4)

2 голосов
/ 27 марта 2011

Просто измените этот код:

switch(toPurchase){
    case 1:
        cout << "You can't purchase anything yet. NOOB" << endl;
        break;
    case 2:
        break;
    }

на:

if (toPurchase)
{
    cout << "You can't purchase anything yet. NOOB" << endl;
}
0 голосов
/ 27 марта 2011

C ++ - статически типизированный язык.Вы объявили toPurchase как переменную bool, так что она будет оставаться bool до тех пор, пока вы не произвели насильственное приведение к чему-то другому.Но ручное литье не рекомендуется.

Хотя int может быть неявно приведен к bool, и это происходит в toPurchase = player->giveOptions(2,"Yes","No","","",""); .

Этот присваиватель значения не меняет тип toPurchase, как, например, в php.Он преобразует возвращаемое значение giveOptions в bool и присваивает этому приведенному значению bool значение «Купить».

...