eigene registry klasse?



  • Hiho, ich möchte die objekte eines programms alle in einer zentralen liste 'registrieren' Dabei ist mir nicht klar wie ich parameter vom Konstruktor einer abgeleiteten Klasse in die BasisKlasse 'weiterleiten' kann ?

    ich hatte mir folgendes vorgestellt:

    Registry Klasse (myRegistry, welche nur nur einen vector<*myObject> und entsprechende funktionen wie 'add_to_list' und 'remove_from_list' enthält)

    Alle Objekte im Projekt sind von einem BasisObjekt (myBaseObject) abgeleitet

    class myBaseObject
    {
    //Constructor
    myBaseObject(myRegistry *_registry)
    { 
    _registry->add_to_list(this);
    // then do some other initialisations
    }
    };
    

    mein Problem ist wie ich den Konstruktor in den abgeleiteten Klassen schreibe, so daß ich einen parameter vom Typ *myRegistry beim instantiieren übergeben MUSS.

    folgendes scheint nicht zu funktionieren

    class myDerivedObject:myObject
    {
    myDerivedObject(myRegistry *_registry)
    {
    // do some more initialisations
    }
    };
    

    der Kompiler meckert er hat keinen passenden Konstruktor in der Basisklasse. Irgendwie benötigt er dort einen parameterlosen Konstruktor??? Ich möchte aber nicht den Konstruktor in der Basisklasse leer lassen und folgendes machen:

    class myDerivedObject:myBaseObject
    {
    myDerivedObject(myRegistry *_registry)
    {_registry->add_to_list(this);}
    };
    

    Weil, wenn ich jetzt ein weiteres Objekt von myDerivedObject ableite, dann habe ich das selbe problem wieder 😞 (und selbst wenns klappt würde ich dieses weitere, abgeleitete Objekt dann mehrfach registrieren)

    Stehe heute nacht total aufm schlauch 😞 😕 😕 😕



  • Ich versteh dein Problem nicht ganz, aber es hört sich für mich so an, als dass Deine Registry-Klasse ein typisches Beipiel für ein Singleton ist.

    Du brauchst doch bestimmt nur systemweit ein Objekt dieser Klasse, oder?



  • antialias schrieb:

    class myDerivedObject:myObject
    {
    myDerivedObject(myRegistry *_registry)
    {
    // do some more initialisations
    }
    };

    Ich denke hier hat sich ein einfacher Tippfehler eingeschlichen.
    Wenn du die Codefragemente per copy and paste eingefügt hast dann liegt dein Fehler an der hier wohl falschen Benennung der Basisklasse.



  • Parameter an die Basisklasse weiterleiten kannst du ganz einfach ind er Initialisierungsliste:

    class Base
    {
        myRegistry* registry_;
    
    public:
        Base(myRegistry* registry)
        : registry_(registry)
        {
            registry_->add_to_list(this);
        }
    
        virtual ~Base() 
        {
            registry_->remove_from_list(this); //sowas nicht vergessen, sonst knallts :)
        }
    };
    
    class Derived : public Base
    {
    public:
        Derived(myRegistry* registry)
        : Base(registry)
        {
            //some more...
        }
    };
    


  • *kopfklatsch*. Danke viande ... mann bin ich blöd 🙄
    ..ich geh mir doch mal den stroustrup kaufen...in den ganzen c++ büchern die hier rumfahren stand davon nix drin 😞


Anmelden zum Antworten