Jeweils anderes Objekt in Funktion erzeugen
-
Hallo!
Ich habe da ne Interfaceklasse und jetzt zum Beispiel 2 abgeleitete klassen also so:
class Interfaceklasse {
public:
virutal void foo() = NULL;
};class A: public Interfaceklasse {
public:
void foo();
};class B: public Interfaceklasse {
void foo();
};Und jetzt will ich in einer Funktion ein Objekt der Klasse A oder B erzeugen je nachdem was im Parameter steht jetzt nehme ich einen int Parameter der auf dem jeweiligen Wert ist je nachdem ob Objekt A oder B erzeugt werden soll.
void bar(int AorB) {//wenn AorB==0 Objekt der Klasse A erzeugen wenn AorB==1 Objekt der Klasse B erzeugen
InterfaceKlasse* newObject = NULL;
if(AorB == 0) {
newObjekt = new A;
} else if(AorB == 1) {
newObjekt = new B;
}
}Dieses Vorgehen scheint mir nicht gerade gut da sobald ich zum Beispiel ein neues Objekt C anlege noch eine if Abfrage also if(AorB == 2) zb einfügen müsste...
Meine Frage ist wie kann ich der Funktion besser sagen welches Objekt er erzeugen soll also am liebsten wäre es mir zum Beispiel so:
void bar(char* NameOfClass) {
InterfaceKlasse* newObject = new NameOfClass;
}
Dann müsste ich nicht mehr neue If Abfragen einfügen aber wie macht man das in C++ da gibt es sicher ne Möglichkeit...Danke für die Hilfe
-
}
void bar(int AorB) {//wenn AorB==0 Objekt der Klasse A erzeugen wenn AorB==1 Objekt der Klasse B erzeugen
InterfaceKlasse* newObject = NULL;Dieses Vorgehen scheint mir nicht gerade gut da sobald ich zum Beispiel ein neues Objekt C anlege noch eine if Abfrage also if(AorB == 2) zb einfügen müsste...
};class B: public Interfaceklasse {
void foo();
};
Dann müsste ich nicht mehr neue If Abfragen einfügen aber wie macht man das in C++ da gibt es sicher ne Möglichkeit...Danke für die Hilfe
Und jetzt will ich in einer Funktion ein Objekt der Klasse A oder B erzeugen je nachdem was im Parameter steht jetzt nehme ich einen int Parameter der auf dem jeweiligen Wert ist je nachdem ob Objekt A oder B erzeugt werden soll.
void bar(char* NameOfClass) {
InterfaceKlasse* newObject = new NameOfClass;
}Meine Frage ist wie kann ich der Funktion besser sagen welches Objekt er erzeugen soll also am liebsten wäre es mir zum Beispiel so:
class Interfaceklasse {
public:
virutal void foo() = NULL;
};
Hallo!Ich habe da ne Interfaceklasse und jetzt zum Beispiel 2 abgeleitete klassen also so:
if(AorB == 0) {
newObjekt = new A;
} else if(AorB == 1) {
newObjekt = new B;
}
class A: public Interfaceklasse {
public:
void foo();
-
Witzigwitzig
Ich habe da ne Interfaceklasse und jetzt zum Beispiel 2 abgeleitete klassen also so:
class Interfaceklasse { public: virutal void foo() = NULL; };
class A: public Interfaceklasse { public: void foo(); };
class B: public Interfaceklasse { void foo(); };
Und jetzt will ich in einer Funktion ein Objekt der Klasse A oder B erzeugen je nachdem was im Parameter steht jetzt nehme ich einen int Parameter der auf dem jeweiligen Wert ist je nachdem ob Objekt A oder B erzeugt werden soll.
void bar(int AorB) {//wenn AorB==0 Objekt der Klasse A erzeugen wenn AorB==1 Objekt der Klasse B erzeugen InterfaceKlasse* newObject = NULL; if(AorB == 0) { newObjekt = new A; } else if(AorB == 1) { newObjekt = new B; } }
Dieses Vorgehen scheint mir nicht gerade gut da sobald ich zum Beispiel ein neues Objekt C anlege noch eine if Abfrage also if(AorB == 2) zb einfügen müsste...
Meine Frage ist wie kann ich der Funktion besser sagen welches Objekt er erzeugen soll also am liebsten wäre es mir zum Beispiel so:
void bar(char* NameOfClass) { InterfaceKlasse* newObject = new NameOfClass; }
Dann müsste ich nicht mehr neue If Abfragen einfügen aber wie macht man das in C++ da gibt es sicher ne Möglichkeit...
Besser so?
-
eine map die namen auf create funktionen mapped. jetzt fuere jede abgeleitete klasse nur noch ein eintrag in der map hinzugefuegt werden. das geht ueber globale objekte recht simpel.
-
Eine imo einfachere Möglichkeit ist mit Templates zu arbeiten
template <class T> InterfaceKlasse* bar() { InterfaceKlasse* newObject = new T; return newObject; }
Und je nachdem was du brauchst, gibst du beim Aufruf an
InterfaceKlasse* newObject = bar<A>();
btw:
Schreibe bittevirtual void foo() = 0;
NULL ist für Zeigerkontext vorgesehen, der hier aber nicht vorliegt.
-
Ist NULL nicht sowieso obsolete? Weil NULL==0, oder? Ich benutze nur 0, ist das schlimm?
-
#define NULL 0;
-
ness schrieb:
Ist NULL nicht sowieso obsolete? Weil NULL==0, oder? Ich benutze nur 0, ist das schlimm?
Ne, ist gut so.
NULL ist in C++ wirklich obsolete. Wobei ja ein nullptr oder aehnliches fuer NULL Zeiger im gespraech ist (oder schon angenommen/abgelehnt - ich verfolge die standardisierung nicht wirklich).