 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Guest
|
Posted: Fri Sep 29, 2006 5:57 pm Post subject: Konstruktor im Konstruktor der selben Klasse aufrufen |
|
|
Hallo,
gibt es in C++ die Möglichkeit, in einem Konstruktor einen anderen in
der
selben Klasse aufzurufen?
Von Java kenne ich sowas:
class A
{
A() {}
A(String str)
{
this();
}
}
In C# soll das möglich sein:
class A
{
A() {}
A(String str) : this()
{
}
}
Gibt es in C++ nichts ähliches?
Gruß
Heiko |
|
| Back to top |
|
 |
Guest
|
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Fri Sep 29, 2006 6:50 pm Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen |
|
|
On 29 Sep 2006 05:57:25 -0700, HeikoWonneberger (AT) justmail (DOT) de wrote:
| Quote: | Hallo,
gibt es in C++ die Möglichkeit, in einem Konstruktor einen anderen in
der selben Klasse aufzurufen?
Von Java kenne ich sowas:
class A
{
A() {}
A(String str)
{
this();
}
}
In C# soll das möglich sein:
class A
{
A() {}
A(String str) : this()
{
}
}
Gibt es in C++ nichts ähliches?
|
Ich kenne weder Java noch C#, also bin ich nicht ganz sicher, was Du
hiermit erreichen möchtest.
Man kann durchaus den "this"-Zeiger im Konstruktor einer Klasse
gebrauchen; allerdings könnte er auf ein Basis-Objekt in einer
abgeleiteten Klasse zeigen, da das momentan zu konstruierende Objekt
erst vollständig ist, als der Konstruktor fertig ist. Es gibt
allerdings Fälle, wo man Members mit "this" explizit differenzieren
muss (vor allem bei Templates).
Mit einem Beispielproblem könnte man versuchen, eine C++-Lösung zu
zeigen.
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Fri Sep 29, 2006 7:40 pm Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen |
|
|
HeikoWonneberger (AT) justmail (DOT) de wrote:
| Quote: | gibt es in C++ die Möglichkeit, in einem Konstruktor einen anderen in
der selben Klasse aufzurufen?
|
Nein.
Es gibt aber zwei Workarounds:
- eine Basisklasse anlegen. Deine Konstruktoren rufen dann den
Konstruktor der Basisklasse auf.
class AImpl {
public:
AImpl(int arg1, int arg2);
};
class A : private AImpl {
public:
A() : AImpl(42, 23) { ... }
A(const char* x) : AImpl(*x, strlen(x)) { ... }
};
- eine init-Funktion verwenden.
class A {
void init(int arg1, int arg2);
public:
A() { init(42, 23); ... }
A(const char* x) { init(*x, strlen(x)); ... }
};
Letzteres ist vor allem dann, wenn es sich bei den zu initialisierenden
Elementen um Basistypen handelt, eine einfache und schnelle Möglichkeit.
Wenn du für eine Membervariable mit Konstruktor den Initialisierer nicht
angibst, wird diese Membervariable zuerst default-konstruiert, was
erhebliche Auswirkungen auf die Performance haben kann.
In Java ist das vor allem deswegen kein Problem, da alle Member dort
einen primitiven Typ haben - ein String-Member wird halt nicht mit einem
Leerstring, sondern einem Nullzeiger initialisiert, was quasi nichts kostet.
Stefan |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Sep 29, 2006 9:41 pm Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen |
|
|
HeikoWonneberger (AT) justmail (DOT) de writes:
| Quote: | Hat sich erledigt.
|
Es gibt aber Bestrebungen, solche forwarding constructors einzuführen. |
|
| Back to top |
|
 |
Guest
|
Posted: Fri Sep 29, 2006 10:12 pm Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen |
|
|
Hallo Stefan,
danke für deine Antwort.
Stefan Reuther schrieb:
| Quote: | - eine Basisklasse anlegen. Deine Konstruktoren rufen dann den
Konstruktor der Basisklasse auf.
|
Eigentlich handelt es sich um meine ersten Schritte in C++/CLI (VC++
2005 .NET) und hier gibt es im "managed" Code keine Mehrfachvererbung
mehr und die Basisklasse, von der ich meine Form ableiten muß, ist
schon vorgegeben.
| Quote: | - eine init-Funktion verwenden.
|
Habe ich sonst bei Klassen im Standard-C++ eigentlich auch immer so
gemacht und werde es so auch wieder tun. Allerdings hat diese Variante
den kleinen Nachteil, daß die Init-Methode mehrfach aufgerufen werden
könnte. Das setzt allerdings wieder vorraus, daß vor einem zweiten
Aufruf in einer Reset-Methode die Resourcen wieder frei gegeben werden
müssen, die für gewöhnlich erst im Konstruktor freigegeben würden.
In vielen Fällen kann Init und Reset natürlich von Vorteil sein. In
meinem Fall darf ich sie nicht mehrmals aufrufen, weil nicht alle
Member zurückgesetzt werden dürfen. Oder man schreibt die Teile, die
nur einmal ausgeführt werden dürfen, in jeden Konstruktor.
Gruß
Heiko |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sat Sep 30, 2006 2:52 pm Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen |
|
|
TaX,
HeikoWonneberger (AT) justmail (DOT) de wrote:
| Quote: | - eine Basisklasse anlegen. Deine Konstruktoren rufen dann den
Konstruktor der Basisklasse auf.
Eigentlich handelt es sich um meine ersten Schritte in C++/CLI (VC++
2005 .NET) und hier gibt es im "managed" Code keine Mehrfachvererbung
mehr und die Basisklasse, von der ich meine Form ableiten muß, ist
schon vorgegeben.
|
Wenn Mehrfachvererbung keine Option ist, kannst du die "Basisklasse"
auch als Member anlegen. Dann kannst du allerdings 'protected' nicht
mehr nutzen, um Teile der 'AImpl'-Klasse für die 'A'-Klasse freizugeben.
| Quote: | - eine init-Funktion verwenden.
Habe ich sonst bei Klassen im Standard-C++ eigentlich auch immer so
gemacht und werde es so auch wieder tun. Allerdings hat diese Variante
den kleinen Nachteil, daß die Init-Methode mehrfach aufgerufen werden
könnte.
|
Das Risiko lässt sich dadurch minimieren, dass du die init-Methode
privat machst.
Stefan |
|
| Back to top |
|
 |
Guest
|
Posted: Mon Oct 02, 2006 1:44 pm Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen |
|
|
Hallo,
danke für Eure Antworten.
Thomas Maeder schrieb:
| Quote: | Es gibt aber Bestrebungen, solche forwarding constructors einzuführen.
|
Habe gestern in der ECMA-Beschreibung zu C++/CLI was gefunden. Dort
nennt man es Delegating constructors.
Gruß
Heiko |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|