Deklaracja obiektu switch/case c++

0

Witam mam problem z deklaracja obiektu w switch case. Dostaje blad ze obiekty 'g1' i 'g2' nie zostaly zdeklarowane. Prosze o pomoc :)

switch (g1tank)
   {
      case 1: {GRACZ g1; break;}
      case 2: {GRACZ_MEDIUM g1; break;}
      case 3: {GRACZ_BIG g1; break;}
     default: {GRACZ_MEDIUM g1; break;}
   }
    g2tank=tanktype(2);
    switch (g2tank)
    {
        case 1: {GRACZ g2; break;}
        case 2: {GRACZ_MEDIUM g2; break;}
        case 3: {GRACZ_BIG g2; break;}
        default: {GRACZ_MEDIUM g2; break;}
    }
    g1.insert_info();
    g2.insert_info();
 
1

Wszystkie identyfikatory sa niedostepne poza zasiegiem, w ktorym zostaly zadeklarowane.

Wiecej informacji tutaj: http://msdn.microsoft.com/en-us/library/b7kfh662.aspx

4
   switch (g1tank)
   {
      case 1: {GRACZ g1; break;}
      case 2: {GRACZ_MEDIUM g1; break;}
      case 3: {GRACZ_BIG g1; break;}
     default: {GRACZ_MEDIUM g1; break;}
   }

Bo tak nie możesz (tzn. możesz, ale to nie robi tego co myślisz że robi).

Możesz zrobić coś w rodzaju (zakładając że GRACZ_BAZA jest klasą bazową dla wszystkich pozostałych, trochę przesadzając z new-ami):

   GRACZ_BAZA *g1;
   switch (g1tank)
   {
      case 1: {g1 = new GRACZ(); break;}
      case 2: {g1 = new GRACZ_MEDIUM(); break;}
      case 3: {g1 = new GRACZ_BIG(); break;}
     default: {g1 = new GRACZ_MEDIUM(); break;}
   }
2

Może jeszcze takie rozwiązanie (ja wole takie podejście):

#include <iostream>
using namespace std;

class GRACZ_BAZA
  {
   public:
  };

class GRACZ:public GRACZ_BAZA
  {
   public:
   GRACZ() { cout<<"NORMAL"<<endl; }
  };

class GRACZ_MEDIUM:public GRACZ_BAZA
  {
   public:
   GRACZ_MEDIUM() { cout<<"MEDIUM"<<endl; }
  };
  
class GRACZ_BIG:public GRACZ_BAZA
  {
   public:
   GRACZ_BIG() { cout<<"BIG"<<endl; }
  };

template<class T>  GRACZ_BAZA *make() { return new T; }

typedef GRACZ_BAZA *MAKE();
MAKE *tb[]=
  {
   make<GRACZ>,
   make<GRACZ_MEDIUM>,
   make<GRACZ_BIG>,
  };
     
int main()
  {
   for(unsigned i=1;i<=3;++i)
     {
      GRACZ_BAZA *g=tb[i-1]();
      
      delete g;
     }
   return 0;
  }

lub jeżeli mamy C++11 to:

typedef GRACZ_BAZA *MAKE();
MAKE *tb[]=
  {
   [] () -> GRACZ_BAZA * { return new GRACZ; },
   [] () -> GRACZ_BAZA * { return new GRACZ_MEDIUM; },
   [] () -> GRACZ_BAZA * { return new GRACZ_BIG; },
  };

1 użytkowników online, w tym zalogowanych: 0, gości: 1