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 ...