C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Konstruktor im Konstruktor der selben Klasse aufrufen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Guest






PostPosted: Fri Sep 29, 2006 5:57 pm    Post subject: Konstruktor im Konstruktor der selben Klasse aufrufen Reply with 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?

Gruß
Heiko
Back to top
Guest






PostPosted: Fri Sep 29, 2006 6:43 pm    Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen Reply with quote



Hat sich erledigt.
Laut dem Beitrag von 2003
http://groups.google.de/group/de.comp.lang.iso-c++/browse_thread/thread/a56224727faedb88/488fd99b344d209c?lnk=gst&q=konstruktor&rnum=9#488fd99b344d209c
gibts das in C++ nicht.

Heiko
Back to top
Bob Hairgrove
Guest





PostPosted: Fri Sep 29, 2006 6:50 pm    Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen Reply with quote



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





PostPosted: Fri Sep 29, 2006 7:40 pm    Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen Reply with quote

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





PostPosted: Fri Sep 29, 2006 9:41 pm    Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen Reply with quote

HeikoWonneberger (AT) justmail (DOT) de writes:

Quote:
Hat sich erledigt.

Es gibt aber Bestrebungen, solche forwarding constructors einzuführen.
Back to top
Guest






PostPosted: Fri Sep 29, 2006 10:12 pm    Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen Reply with quote

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





PostPosted: Sat Sep 30, 2006 2:52 pm    Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen Reply with quote

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






PostPosted: Mon Oct 02, 2006 1:44 pm    Post subject: Re: Konstruktor im Konstruktor der selben Klasse aufrufen Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.