Konstruktor im Konstruktor aufrufen



  • Hi
    hab schon im Spieleprogrammierungsforum gepostet, aber keine Antwort erhalten und da mein Problem eher auf C++ zurückzuführen ist, frag ich hier nochmal.
    Ich habe zwei Konstruktoren mit unterschiedlichen Parameterlisten. Um einen bestimmten Teil des Codes nicht doppelt zu haben (Redundanz, Wartbarkeit etc.), will ich in dem einen Konstruktor den anderen aufrufen. Allerdings macht das ganze nicht das, was ich will. Wie bekommt man sowas am besten hin? Mit einer privaten Funktion Init oder gibt es noch eine bessere Möglichkeit?
    Hier mal ein Beispielcode:

    class foo
    {
    public:
      foo(int x) {....}
      foo(int x, int y);
    };
    
    foo(int x, int y)
    {
      // hier muss ich foo(x) aufrufen und danach noch noch was mit dem y anstellen
      // mein Versuch, der gescheitert ist:
      foo::foo(x);
    }
    


  • Hallo

    Mit einer privaten Funktion Init

    Korrekt. Konstruktoren kann man nämlich nicht wie normale Methoden aufrufen.
    In deinem Fall wird nichts weiter gemacht als ein temporäres Objekt erstellt das gleich wieder gelöscht wird.

    bis bald
    akari



  • c++ bietet allerdings die möglichkeit der parametervorbelegung.

    foo(int x, int y = 0);
    // ...
    foo f(23);
    

    bei primitiven typen hast du allerdings das problem, dass es schwer wird, einen übergebenen parameter von einem nicht übergebenen zu unterscheiden.



  • Ja, private Init Funktion, wurde schon geschrieben, that's the way to go.

    Nur so nebenbei: 'explicit' nicht vergessen (es sei denn du willst dass ein int implizit in ein foo konvertierbar ist).



  • placement new auf this könnt da abhilfe schaffen.
    wobei ich das nicht getestet hab 🙂
    ausserdem schauts schirch aus, da wär die init funktion schöner.

    foo::foo(int x, int y)
    {
     new(this) foo(x); 
    }
    


  • inp schrieb:

    placement new auf this könnt da abhilfe schaffen.
    wobei ich das nicht getestet hab 🙂

    Damit werden sämtliche Basisklassen und Membervariablen nach der Default-Konstruktion nochmal konstruiert. Das provoziert nur Ressourcen-Lecks.



  • LordJaxom schrieb:

    inp schrieb:

    placement new auf this könnt da abhilfe schaffen.
    wobei ich das nicht getestet hab 🙂

    Damit werden sämtliche Basisklassen und Membervariablen nach der Default-Konstruktion nochmal konstruiert. Das provoziert nur Ressourcen-Lecks.

    stimmt, aber im falle das die klasse nicht für vererbung gedacht ist wärs ne lösung.



  • inp schrieb:

    LordJaxom schrieb:

    inp schrieb:

    placement new auf this könnt da abhilfe schaffen.
    wobei ich das nicht getestet hab 🙂

    Damit werden sämtliche Basisklassen und Membervariablen nach der Default-Konstruktion nochmal konstruiert. Das provoziert nur Ressourcen-Lecks.

    stimmt, aber im falle das die klasse nicht für vererbung gedacht ist wärs ne lösung.

    Wenn es dir egal ist dass der Code strenggenommen falsch ist vielleicht.
    Das Problem ist: an der Stelle wo du dein placement new aufrufst ist das Objekt schon konstruiert. Du konstruierst also ein Objekt über ein anderes drüber. Bin mir ziemlich sicher dass das laut Standard undefiniertes Verhalten ist.



  • Die Klasse braucht ja nur einen std::string enthalten, dann kommt es schon völlig ohne Vererbung zu Problemen 😉



  • mmmk, placement new im konstruktor ist böse 🙂



  • inp schrieb:

    mmmk, placement new im konstruktor ist böse 🙂

    Sagen wir lieber p-new ist auf this böse 🙂
    In Exceptional C++ stehen ein paar Seiten dazu und wie böse es sei ...



  • KasF schrieb:

    inp schrieb:

    mmmk, placement new im konstruktor ist böse 🙂

    Sagen wir lieber p-new ist auf this böse 🙂
    In Exceptional C++ stehen ein paar Seiten dazu und wie böse es sei ...

    les grad more exceptional, muss eh noch das ganze wissen was ich das ganze letzte halbe jahr angelesen hab umsetzen 🙂 damit es fest wird 😃



  • inp schrieb:

    more exceptional

    Schlummert bei mir immer noch im Regal und wartet darauf von mir gelesen zu werden 😋



  • KasF schrieb:

    inp schrieb:

    more exceptional

    Schlummert bei mir immer noch im Regal und wartet darauf von mir gelesen zu werden 😋

    hehe, bei mir schlummert noch das red dragon book (angekratzt), 3d engine design (angekratzt), graphics programming black book (angekratzt 🙂 ), graphics programming (van dam) 😃

    wenn ich mit all dem fertig bin vergeht sicher noch ein halbes jahr 😃



  • inp schrieb:

    hehe, bei mir schlummert noch das red dragon book (angekratzt), 3d engine design (angekratzt), graphics programming black book (angekratzt 🙂 ), graphics programming (van dam) 😃

    wenn ich mit all dem fertig bin vergeht sicher noch ein halbes jahr 😃

    Hehe das kenn ich nur zu gut :). OK Off-Topic, wir hören hier lieber auf ...


Anmelden zum Antworten