FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Überladene Konstruktoren aufrufen? (C++)

Überladene Konstruktoren aufrufen? (C++) 2005-06-25 16:36
Fred
Wenn ich zwei überladene Konstruktoren habe, z.B.
Foo(int x); Foo(int x, int y); Wie kann ich dann innerhalb von Foo(x, y) den Konstruktor Foo(x) aufrufen? In Java geht das ja recht einfach per this(x), in C++ klappt das aber leider nicht. Auch Foo(x) funktioniert nicht.

Geht das überhaupt? Würde mich wunder, falls nicht. low_level, Du weisst das doch bestimmt [img]http://www.fb18.de/gfx/25.gif[/img]

Re: Überladene Konstruktoren aufrufen? (C++) 2005-06-25 19:45
georg
Wenn ich mich richtig erinnere, geht das mit der Schreibweise,
mit der man auch Exemplarvariablen mit Parametern ausstattet,
die erst dem Konstruktor bekannt sind:


class Foo { ... public: Foo(int x, int y): Foo(x) { ... } };
EDIT: Ich habe mich nicht richtig erinnert. Diese Schreibweise
benutzt man zum Aufrufen des Konstruktors von Basisklassen.

Re: Überladene Konstruktoren aufrufen? (C++) 2005-06-26 05:23
Anonymer User
Hmmja.

Die einfache und sicherere Lösung ist, um das Problem herumzudesignen:

struct Foo {
Foo(x) {baue_Foo(x);}
Foo(x,y) {baue_Foo(x); /* ….. */ }
baue_Foo(x) { /* ….. */ }
}

Wenn Du Abenteuer magst, kannst Du auch ein placement new versuchen:

struct Foo {
Foo(x) {/* ….. */}
Foo(x,y) {new (this) Foo(x); /* ….. */ }
}

Beim "normalen" Erzeugen (Foo meinFoo = Foo(x); oder Foo meinFoo = new Foo(x);) findet als erster Schritt auch immer eine Speicherbelegung statt, entweder statisch auf dem Stack oder dynamisch im Freispeicher. Um dies zu umgehen, kann man mit dem Code oben den Konstruktor ein weiteres Mal auf dem bereits angeforderten Speicher aufrufen.

WARNUNG: Im Zusammenspiel mit Basisklassen und Objektzählern o.ä. kann das bös in die Hose gehen. Ich würde es freiwillig nie benutzen, sondern immer die 1. Lösung wählen.

Re: Überladene Konstruktoren aufrufen? (C++) 2005-06-28 16:03
Anonymer User
Die C++Faq Lite diskutiert das Problem ebenfalls sinnvoll.
http://www.parashift.com


EP