2010-03-20 7 views
3

Je programme un simple RPG basé sur du texte en utilisant une instruction switch pour une boucle de jeu. Le programme fonctionne bien jusqu'à ce que j'essaie d'ajouter une autre déclaration de cas, à ce point il me donne les trois erreurs suivantes: "sauter à l'étiquette de cas" (erreur se produit à la ligne du cas nouvellement ajouté), et deux "initialise l'initialisation de" ClassName * objectName '"(des erreurs se produisent lorsque les nouveaux objets sont créés dans le cas 2). Je vais coller le code important, si quelqu'un a besoin de plus, s'il vous plaît faites le moi savoir.Erreur de cas de déclaration de commutateur C++

int main(void) 
{ 
    // add weapons to array 
    Weapon *weaponList[12]; 
    // Rusty Sword 
    weaponList[0] = new Weapon(0,0,0); 
    weaponList[0]->SetAll(0,2,3); 
    // Bronze Sword 
    weaponList[1] = new Weapon(0,0,0); 
    weaponList[1]->SetAll(1,5,10); 
    // Bronze Battle Axe 
    weaponList[2] = new Weapon(0,0,0); 
    weaponList[2]->SetAll(2,15,30); 
    // Iron Sword 
    weaponList[3] = new Weapon(0,0,0); 
    weaponList[3]->SetAll(3,25,70); 

    // add armor to array 
    Armor *armorList[12]; 
    // Worn Platemail 
    armorList[0] = new Armor(0,0,0); 
    armorList[0]->SetAll(0,2,3); 
    // Bronze Chainmail 
    armorList[1] = new Armor(0,0,0); 
    armorList[1]->SetAll(1,5,8); 
    // Bronze Platemail 
    armorList[2] = new Armor(0,0,0); 
    armorList[2]->SetAll(2,7,20); 
    // Iron Chainmail 
    armorList[3] = new Armor(0,0,0); 
    armorList[3]->SetAll(3,15,60); 

     while(gamestate != 8) 
     { 
      switch(gamestate) 
      { 
       case 0: 
       cout << " /| Welcome!\n" 
        << " || \n" 
        << " || \n" 
        << " || \n" 
        << "_||_ \n" 
        << " 88 \n" 
        << " 88 Name: "; 
       cin >> heroName; 
       gamestate = GAME_STATE_MENU; 
       break; 

      case 1: 
       cout << "\n" 
        << "'/stats' will show you your stats\n" 
        << "'/shop' will let you visit the weapon shop\n" 
        << "secret commands: /setweapon # /setarmor # /setheroexp #\n" 
        << "\n"; 

       cout << "Command: "; 
       cin >> command; 

       if (strcmp(command, "/stats") == 0) 
       { 
        gamestate = 2; 
        break; 
       } 

       else if (strcmp(command, "/shop") == 0) 
       { 
        gamestate = 3; 
        break; 
       } 

       else if (strcmp(command, "/fight") == 0) 
       { 
        gamestate = 4; 
        break; 
       } 

       else if (strcmp(command, "/setweapon") == 0) 
       { 
        cin >> testNum; 
        heroWeapon = testNum; 
        break; 
       } 

       else if (strcmp(command, "/setarmor") == 0) 
       { 
        cin >> testNum; 
        heroArmor = testNum; 
        break; 
       } 

       else if (strcmp(command, "/setheroexp") == 0) 
       { 
        cin >> testNum; 
        heroExp = testNum; 
        LevelUp(); 
        break; 
       } 

       else if (strcmp(command, "/exit") == 0) 
       { 
        gamestate = 8; 
        break; 
       } 

       else 
       { 
        cout << "Please enter a valid command.\n"; 
        gamestate = 2; 
        break; 
       } 

      case 2: 
       Weapon *wCurrent = weaponList[heroWeapon]; 
       Armor *aCurrent = armorList[heroArmor]; 
       heroWeaponPower = wCurrent->GetWeaponAttack(); 
       heroArmorDefense = aCurrent->GetArmorDefense(); 
       heroPowerDefault = ((heroLevel - 1) * 10) + 10; 
       heroPower = heroPowerDefault + (heroStrength * 2) + heroWeaponPower; 
       heroDefenseDefault = ((heroLevel - 1) * 2) + 5; 
       heroDefense = heroDefenseDefault + (heroAgility/5) + heroArmorDefense; 
       heroHealthDefault = (heroLevel * 5) + 20; 
       heroHealth = heroHealthDefault + (heroStamina * 10); 
       cout << "\nS T A T S\nName: " 
        << heroName 
        << "\nLevel: " 
        << heroLevel 
        << "\nExp: " 
        << heroExp << "/" << expForLevel[heroLevel] 
        << "\nGold: " 
        << heroGold 
        << "\nHealth: " 
        << heroHealth 
        << "\nPower: " 
        << heroPower 
        << "\nDefense: " 
        << heroDefense 
        << "\nWeapon: " 
        << weaponNameList[heroWeapon] 
        << "\nArmor: " 
        << armorNameList[heroArmor] 
        << "\n\n"; 
       system("PAUSE"); 
       gamestate = 2; 
       break; 

      case 3: 
       break; 
      } 
     } 

     return 0; 
    } 
+3

Cela dépend probablement du code que vous avez commenté. –

+1

Oui, votre code commenté est probablement le coupable. – Jaxidian

+1

Pourquoi faire une pause pour chaque branche d'un if/else alors que vous pourriez avoir une seule pause pour toute cette affaire? – Steve314

Répondre

9

par les sons de celui-ci, vous avez:

case 2: 
    Type somevar = ...; 
    ... 
    break; 

case 3: 

Pour atteindre le cas 3, le compilateur génère un saut après l'initialisation de somevar.

Pour corriger, utiliser des accolades pour créer un bloc autour de la déclaration de variable:

case 2: 
    { 
    Type somevar = ...; 
    ... 
    } 
    break; 
6

déclarations d'envelopper dans un cadre de pile ... euh ... portée locale ... :)

switch(gamestate) 
{ 
    case 0: 
    { 
     Apple a; 
     a.DoSomething(); 
    } 
    break; 

    case 1: /* etc. */ break; 
    case 2: /* etc. */ break; 
} 

... ou de les déplacer à l'extérieur du commutateur:

Apple A; 
switch(gamestate) 
{ 
    case 0: a.DoSomething(); break; 
+0

Ce n'est pas réellement un cadre de pile, mais une portée de bloc. C'est la bonne façon de résoudre le problème. –

+0

Vrai, mon mauvais. Fonctionne cependant de la même manière en termes de durée de vie de l'objet. http://msdn.microsoft.com/en-us/library/b7kfh662%28VS.80%29.aspx –

+0

C'était le problème! Merci :) –

3

Considérez ce qui suit:

switch (x) 
{ 
    case 0: 
     int i = 0; 
    case 1: 
     i = 5; 
} 

si x est 1? Ensuite, nous sautons sur l'initialisation de i et juste commencer à l'utiliser. Voici ce que vous obtenez: case 3 a accès aux variables de case 2, mais si vous les utilisez, vous avez commencé à les utiliser sans exécuter leur initialisation.

La solution commune est d'introduire la portée:

switch (x) 
{ 
    case 0: 
    { 
     int i = 0; 
    } 
    case 1: 
    { 
     i = 5; // not possible, no i in this scope 
    } 
} 
3

modifier

Maintenant que nous voyons plus de code, le problème est évident, ce

 case 2: 
      Weapon *wCurrent = weaponList[heroWeapon]; 
      Armor *aCurrent = armorList[heroArmor]; 

déclare deux variables afin que vous puissiez Ne pas mettre un cas après, sauf si vous enveloppez le corps de l'affaire 2 en {}

origine al réponse ci-dessous


La portée des variables déclarées dans un cas sont les accolades qui entourent le commutateur sauf si vous ajoutez un jeu supplémentaire d'accolades. donc quelque chose comme ça fonctionne.

switch(gamestate) 
    { 
     case 0: 
      foo a; 
      break; 
    } 

mais cela permet une affaire de sauter l'initialisation d'une référence, mais encore, de sorte qu'il génère une erreur.

switch(gamestate) 
    { 
     case 0: 
      foo a; 
      break; 

     case 1: 
      break; 
    } 

Donc, vous devez le faire à la place, maintenant la portée de a est limitée à la casse 0.

switch(gamestate) 
    { 
     case 0: 
      { 
      foo a; 
      } 
      break; 

     case 1: 
      break; 
    } 

Soit dit en passant, lorsque vous avez modifié votre code pour laisser de côté les choses hors de propos, vous avez également supprimé le code qui a causé le problème. ;)

Questions connexes