compiler doesn't like me creating an object in a switch statement

Started by
6 comments, last by immanuelx2 15 years, 10 months ago
int main()
{
     int cmd;
     int playerDmg = 14, playerHP = 100;
     int act = 0; //0 = adventure, 1 = encounter
     
     Player player1;
     vector<string> inventory;    

     inventory.push_back("sword");
     inventory.push_back("armor");
     inventory.push_back("shield");
     
     do
     {
         switch (act)
         {
             case 0: //adventuring
         
                showMenu();
                  
                cin >> cmd;
                cout << endl;
                  
                switch (cmd)
                {
                    case 0:
                        break;
                    case 1:
                        display(inventory);
                        break;
                    case 2:
                        Mob mob1;
                        cout << "\tYou find a " << mob1.getName() << "!" << endl << endl;
                        act = 1;
                        break;
                }   
                
                break;

            case 1: //encounter
        
            showEncounterMenu(mob1);
            
            cin >> cmd;
            cout << endl;
            
            switch (cmd)
            {
                case 1: 
                    if (!mob1.dmg(playerDmg)) act = 0; //if killing blow, end the encounter
                    else mob1.attack(playerHP); //else mob attacks back
                    break;
                case 2:
                    act = 0; //ends the encounter
                    break;
                default:
                    cout << "Invalid command" << endl;
            }
                   
            break;

        default:
            cout << "Invalid command" << endl;
        }
    }
    while (cmd != 0);
    
       
    return 0;
}

void showMenu()
{
     cout << "Enter a command:" << endl;
     cout << "================" << endl;
     cout << "1 - Show Inventory" << endl;
     cout << "2 - Explore" << endl;
     cout << "0 - Exit" << endl;
     cout << endl;
}

void showEncounterMenu(Mob& mob1)
{
     cout << "Enter a command:" << endl;
     cout << "================" << endl;
     cout << "1 - Attack " << mob1.getName() << endl;
     cout << "2 - Leave it alone" << endl;
     cout << endl;
}

void display(const vector<string>& vec)
{
     cout << "-------------" << endl;
     cout << "Inventory [" << vec.size() << "]" << endl;
     cout << "-------------" << endl;
     for (vector<string>::const_iterator iter = vec.begin(); iter != vec.end(); ++iter)
         cout << *iter << endl;
     cout << endl;
}
the error is on the line "showEncounterMenu(mob1);" stating "mob1 undeclared" the only way i can get this to work is to put the Mob mob1; as a global... however i only want to create the mob when the player inputs 2 (Explore). any ideas on how i should approach this??
Advertisement
Use an anonymous scope:
// ...case 2:    { // start anon scope        Mob mob1;        cout << "\tYou find a " << mob1.getName() << "!" << endl << endl;        act = 1;    } // end anon scope    break;
CLICK!!!11
Quote:Original post by rip-off
Use an anonymous scope:
*** Source Snippet Removed ***


didn't work. same error :(
Quote:Original post by immanuelx2
Quote:Original post by rip-off
Use an anonymous scope:
*** Source Snippet Removed ***


didn't work. same error :(


That is because mob hasn't been declared in the right scope. The correction that rip-off and I suggested had to do with a different problem you had.
Ah yes, I didn't read the entire code. You could do the following:
int main(){    // variables    Mob mob;    do    {        switch(...)        {        case 2:                // provided your Mob class correctly implements the rule of three*                // we can "reset" its value like so                mob = Mob();                cout << "\tYou find a " << mob.getName() << "!" << endl << endl;                act = 1;                break;        // other case statements        }        // ...        // use "mob" later on

You could use pointers (or std::auto_ptr) and dynamic allocation, but that might complicate it a lot.

* Rule of Three
Quote:Original post by fpsgamer
Quote:Original post by immanuelx2
Quote:Original post by rip-off
Use an anonymous scope:
*** Source Snippet Removed ***


didn't work. same error :(


That is because mob hasn't been declared in the right scope. The correction that rip-off and I suggested had to do with a different problem you had.


hmm i see.. How should i go about this problem?

here is the concept of my simple text-based RPG:

1. Player is shown a list of a few options, using a do-while loop (1 - show inventory, 2 - explore, 0 - quit)
2. If a player selects 2 (explore) then a Mob is created.
3. act variable is then changed to 1: "encounter"
4. During the encounter, the player menu is changed to encounter menu and fights off the mob.
5. When the mob is killed, return player to main menu (step 1)

i am having trouble with getting step 2 to work.
Quote:Original post by rip-off
Ah yes, I didn't read the entire code. You could do the following:
*** Source Snippet Removed ***
You could use pointers (or std::auto_ptr) and dynamic allocation, but that might complicate it a lot.

* Rule of Three


this worked. thank you very much :)

This topic is closed to new replies.

Advertisement