Referenz als StandardParameter



  • Hallo zusammen,

    ich kann ja für eine Klasse z.B. im Konstruktor einen StandardParameter
    festlegen.

    Ich dachte an etwas wie:

    MyClass(MyClassB& b = MyClassB());
    

    Funktioniert das nur mit einem const?

    Wie wird sowas übersetzt?

    MyClassB& b = MyClassB();
    MyClass obj(b);
    

    Wenn das wirklich im Konstruktor erzeugt würde, wäre meine Referenz
    (, die ich im Konstruktor zwischenspeicher) beim nächsten Aufruf einer Funktion ja schon kaputt..

    Darf ich die Referenz denn zwischenspeichern?

    Aber dann müßte es doch auch ohne const gehen...

    Gruß,
    *Cpp-Anfänger*



  • Du brauchst eine zusätzliche Funktion, die eine statische Instanz erzeugt und eine Referenz darauf zurückgibt.

    MyClassB& helper_funtion()
    {
        static MyClassB instance;
        return instance;
    }
    
    MyClass::MyClass(MyClassB = helper_function())
    {
    //...
    }
    

    Wenn das ein default-Parameter sein soll, würde ich aber darüber nachdenken, das Objekt const zu machen. Es ergibt nur selten Sinn, wenn mehrere Objekte auf dem gleichen default-Objekt herumpfuschen.



  • Hallo viande,

    auf die Factory hätte ich auch selber kommen können...
    thx



  • Also das ist ja mal ein schönes Beispiel für eine Endlosrekursion (auch in viande's Alternative) - der Default-Ctor bekommt ein Default-konstruiertes Objekt als Default-Parameter übergeben, um das anzulegen, muß er wieder sich selbst aufrufen etc. Selbst wenn der Compiler so etwas schlucken sollte -lass es lieber.



  • CStoll schrieb:

    Also das ist ja mal ein schönes Beispiel für eine Endlosrekursion (auch in viande's Alternative) - der Default-Ctor bekommt ein Default-konstruiertes Objekt als Default-Parameter übergeben, um das anzulegen, muß er wieder sich selbst aufrufen etc. Selbst wenn der Compiler so etwas schlucken sollte -lass es lieber.

    Nee, du musst ganz genau lesen 🙂 Das eine ist MyClass und das andere ist MyClassB. Es ist eher ein gutes Beispiel für schlech gewählte Namen 😉



  • OK, du hast gewonnen 😃

    Und um noch etwas sinnvolles beitragen zu können: Wenn du eine Referenz übergeben willst, muß sie auf etwas sinnvolles zeigen - und nötig ist das auch nur, wenn du vorhast, etwas mit der übergebenen Variable zu machen. Ansonsten übergib den Parameter besser als Wert oder const-Referenz (damit würde auch der ursprüngliche Ansatz MyClass::MyClass(Helper = Helper()); funktionieren).



  • Ich glaube nicht dass man den Returnwert einer Funktion an ein T& (ohne const) Parameter binden kann...

    struct T {};
    
    T t()
    {
        return T();
    }
    
    void f(T&)
    {
    }
    
    int main()
    {
        f(t());
    }
    

    Comeau schrieb:

    "ComeauTest.c", line 14: error: initial value of reference to non-const must be an lvalue
          f(t());
            ^
    


  • hustbaer schrieb:

    Ich glaube nicht dass man den Returnwert einer Funktion an ein T& (ohne const) Parameter binden kann...

    Doch, kannst du - aber nur, wenn die Funktion einen T**&** zurückgibt (und zur Laufzeit mußt du noch sicherstellen, daß das übergebene Objekt das Ende der Funktion überlebt).



  • Oh Mann ja.
    Ich denke anhand des Beispieles war klar worum es mir ging...


Log in to reply