W zależności jaka wartość zmiennej if`em tworzy obiekt

0

Mam taki kod:

if(counter == 2)
    {
        if(level_of_access[index] == "0")
        {
            User *login = new User;
        }
        else if(level_of_access[index] == "1")
        {
            Mod *login = new Mod;
        }
        else if(level_of_access[index] == "2")
        {
            Admin *login = new Admin;
        }
        else if(level_of_access[index] == "3")
        {
            Hard_Admin *login = new Hard_Admin;
        }

        login->set_login(_login[index]);
        login->set_password(_password[index]);
        login->set_email(email[index]);
        login->set_year_of_birth(year_of_birth[index]);
        login->set_gender(gender[index]);
        login->set_level_of_access(level_of_access[index]);
        login->set_status(status[index]);

        login->menu();
    }

ale on nie działa, bo musiałbym ten obiekt stworzyć poza if`em, ale wtedy nie osiągnę pożądanego efektu. Jak się popatrzy na kod, to wiadomo o co mi chodzi. Można to jakoś zrobić inaczej? Odpadają konstruktory.

2

wzorzec: fabryka

0

Rozumiem, że wszystkie klasy User, Mod, Admin oraz Hard_Admin dziedziczą po tym samym abstrakcyjnej klasie (np. AbstractUser)? Jeśli tak to wystarczyłoby przenieść deklarację zmiennej *login przed wszystkie ify.

if(counter == 2)
    {
        AbstractUser *login=null;

        if(level_of_access[index] == "0")
        {
            login = new User;
        }
        else if(level_of_access[index] == "1")
        {
            login = new Mod;
        }
        else if(level_of_access[index] == "2")
        {
            login = new Admin;
        }
        else if(level_of_access[index] == "3")
        {
            login = new Hard_Admin;
        }
 
        login->set_login(_login[index]);
        login->set_password(_password[index]);
        login->set_email(email[index]);
        login->set_year_of_birth(year_of_birth[index]);
        login->set_gender(gender[index]);
        login->set_level_of_access(level_of_access[index]);
        login->set_status(status[index]);
 
        login->menu();
    }

Ogólnie warto tu użyć wzorca metoda wytwórcza.

1

http://ideone.com/fAHQZi

#include <iostream>
#include <typeinfo>
#include <unordered_map>
using namespace std;

struct base { base(){} virtual ~base(){} };
struct A:public base { A(){} };
struct B:public base { B(){} };
struct C:public base { C(){} };
typedef base *Creaton();
template<class T> base *creaton() { return new T; };

int main()
  {
   unordered_map<string,Creaton*> tb={{{"a",creaton<A>},{"b",creaton<B>},{"c",creaton<C>}}};
   base *tmp;
   
   tmp=tb["b"]();
   cout<<typeid(*tmp).name()<<endl;
   delete tmp;

   tmp=tb["a"]();
   cout<<typeid(*tmp).name()<<endl;
   delete tmp;
   
   return 0;
  }

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