Klassennamen zur Laufzeit
-
Hi !
Ich würde gerne zur Laufzeit eine Klasse erstellen die einen beliebigen Namen trägt.
Ich habe zZ etwa folgendes:class A { int foo(); ... }; class B { private: ClassCount=0; public: A *C[10]; addClass() { C[ClassCount] = new A; ClassCount++; } ... };zugreifen muss ich auf die erstellten instanzen von A dann über
B->A[i]->foo();ich hätte aber lieber sowas wie:
... addClass(char* name) { name = new A; ClassCount++; } ...so daß ich dann
... addClass(Blah); B->Blah->foo(); ...machen kann... Geht sowas ? Danke!
-
Hallo,
Ich glaube du suchst sowas wie std::map :).
Damit lässt sich z.B. folgendes machen:
#include <iostream> #include <map> using namespace std; class A { public: void foo() { cout << "\n A::foo()\n"; } }; class B { private: public: map<string, A*> C; // Dieses Konstrukt ist doch deutlich schöner void addClass(const string& rhs) { if(!C.count(rhs)) C[rhs] = new A; // Für den Key rhs wird (sofern dieser noch nicht existiert)... // ein Objekt vom Typ A auf dem Heap konstruiert. // Das Objekt, kannst du jetzt über den Key ansprechen... } // edit: Wichtig: Den Speicher musst du auch wieder freigeben (Spätestens im Dtor von B }; int main() { B* obj = new B; obj->addClass("test"); obj->addClass("test2"); cout << "obj->C[\"test\"] = " << obj->C["test"] << endl; cout << "obj->C[\"test2\"] = " << obj->C["test2"] << endl; obj->C["test"]->foo(); // Aufruf von foo für das Objekt mit dem Key "test". obj->C["test2"]->foo(); delete obj; }Ist zwar nicht genau das was du wolltest, aber da ich dein Problem nicht näher kenne, ist das der erste Vorschlag :).
Gruß Caipi