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


Anmelden zum Antworten