Initialisierung einer Referenz in einer Klasse.



  • Servus,
    ich habe 2 singleton-klassen wobei die 2. eine Referenz auf die 1. erhalten soll, mein großes Problem ist das ich keine ahnung habe wie ich die Referenz deklarieren muss???

    class sing01
    {
    private:
        // ...
    public:
        static sing01 &getInstanz()
        {
            static sing01 instanz;
            return instanz;
        }
        // ...
    };
    
    class sing02
    {
    private:
        sing01 &s;
        sing02() { s = sing01::getInstanz(); } // so geht es ja leider nicht :confused:
    public:
        // ...
    };
    

    Ich hoffe es ist klar worauf ich hinaus will???
    Gruß Wolle



  • Referenzen müssen _immer_ eine Referenz auf etwas sein (okay klingt dumm), trifft aber einen wichitgen Punkt.

    Du initialisierst die Referenz erst im Konstruktorrumpf, dort muss sie aber bereits fertig initialisiert sein. Deswegen ab damit in die Initialisieurngsliste.

    MfG SideWinder



  • Sagt dir der Begriff Konstruktor-Initialisierungsliste etwas?

    Foo::Foo(Foobar& test) : testMember(test){}
    


  • MaSTaH schrieb:

    Sagt dir der Begriff Konstruktor-Initialisierungsliste etwas?

    Ja, nur so geht es nicht:

    sing02() : s = sing01::getInstanz() {} // geht nicht.
    sing02(sing02 &s) : s = sing01::getInstanz() {} // geht nicht.
    

    also ich habe noch mehrere Varianten ausprobiert, doch nichts funktioniert, kann es mir denn nicht jemand genau an einem Beispiel erklären???



  • sing02() : s(sing01::getInstanz()) {}
    


  • sing02::sing02 ()
        :
    s(sing01::getInstanz())
    {
    }
    

    Sieht für mich aber trotzdem irgendwie noch nach einem Designfehler aus. Wenn es bloß ein sing01-Objekt geben soll und das sowieso nur in der Klasse sing02 benützt wird dann klingt das nach einer Implementierung die sie für sing02 erledigen soll?!

    Was genau hast du denn vor? Meistens gibts da ein gutes Design-Pattern.

    MfG SideWinder



  • Erstmal noch vielen dank für die Hilfe. Nur bei folgendem Code...

    globHandler &gh;
    engine() : gh(globHandler::getInstanz()) {}
    

    erhalte ich folgenden Fehler

    error C2758: 'engine::gh': muss in der Basisklassen/Element-Initialisierungsliste des Konstruktors initialisiert werden
    

    Ach man, das dumme ding will einfach nicht, gibt es sonst noch eine möglichkeit???



  • @SideWinder:
    Nein nein, ich will in der 2. Klasse nur eine Referenz auf die 1. (eine singleton-class), so das ich in einer Funktion der 2. Klasse nicht ständig den Aufruf mittels "getInstanz()" machen muss, oder um es anderst auszudrücken, ich will das ganze aus Geschwindigkeitsvorteilen so machen.



  • Gib mal ein bisschen mehr Code, irgendwas stimmt da irgendwie nicht. Der Fehler besagt, dass deine Referenz in der Initialisierungsliste des Konstruktors nicht initialisiert wird, das wird sie aber laut deinem Snippet...

    MfG SideWinder



  • Ich danke euch, ich habe es jetzt zum laufen gebracht, ihr habt mir wirklich weitergeholfen. 🙂



  • Wolle. schrieb:

    Ich danke euch, ich habe es jetzt zum laufen gebracht, ihr habt mir wirklich weitergeholfen. 🙂

    Ich bestehe jetzt aber darauf zu erfahren an was es nun genau lag :D:)

    MfG SideWinder



  • Nein, das wäre zu peinlich 😃



  • lol 🤡

    MfG SideWinder



  • Vertiefen wir das thema lieber nicht weiter...
    ich finde wir haben ja schon ein recht nettes Wetter oder was haltet ihr von der zunehmenden Bedrohung durch das immer größer werdende Ozonloch...
    😉


Anmelden zum Antworten