 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Hans Bolte Guest
|
Posted: Fri Apr 09, 2004 7:53 am Post subject: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
Hallo,
kann man aus einem Konstruktor mit Argumenten heraus zunächst den
Standardkonstruktor "durchlaufen lassen" (um nicht so viel doppelt zu
programmieren)?
Wie wäre da die Synthax?
Danke!
Hans
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Fri Apr 09, 2004 7:13 pm Post subject: Re: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
Hans Bolte wrote:
| Quote: | Hallo,
kann man aus einem Konstruktor mit Argumenten heraus zunächst den
Standardkonstruktor "durchlaufen lassen" (um nicht so viel doppelt zu
programmieren)?
|
Sinnvoller ist es eine von beiden genutzte private Methode zu verwenden.
Anhand des Destruktors haben wir das, wenn ich mich recht entsinne, um
die Jahreswende diskutiert.
Das kann gut gehen. Es kann aber auch zu unerklärlichen Problemen
führen, wenn da bei diesen speziellen Operationen "Konstruktion" und
"Destruktion" noch irgendwelche Dinge gekoppelt an den Konstruktor bzw.
Destruktor automatisch passieren, die nicht von Dir im Quelltext
programmiert wurden. Du müßtest also dem Maschinencode untersuchen, um
sagen zu können, ob das mit dem untersuchten Kompilat Nebeneffekt frei
klappt oder nicht. Wenn es bei einem bestimmten Kompiler mit einer
bestimmten Einstellung funktioniert, heißt das nicht, daß es bei anderen
Einstellungen bzw. einem anderen Compiler ebenfalls funktioniert.
Also lagere lieber den gemeinsamen Code in eine private Methode aus.
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Robitzki Guest
|
Posted: Fri Apr 09, 2004 8:40 pm Post subject: Re: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
Georg Maaß wrote:
| Quote: | Hans Bolte wrote:
Hallo,
kann man aus einem Konstruktor mit Argumenten heraus zunächst den
Standardkonstruktor "durchlaufen lassen" (um nicht so viel doppelt zu
programmieren)?
Sinnvoller ist es eine von beiden genutzte private Methode zu verwenden.
Anhand des Destruktors haben wir das, wenn ich mich recht entsinne, um
die Jahreswende diskutiert.
Das kann gut gehen.
|
Was kann gut gehen? Eine private Funktion, die nach Konstuktion des
Objekts die member entsprechend setzt, sollte immer funktionieren.
| Quote: | Es kann aber auch zu unerklärlichen Problemen
führen, wenn da bei diesen speziellen Operationen "Konstruktion" und
"Destruktion" noch irgendwelche Dinge gekoppelt an den Konstruktor bzw.
Destruktor automatisch passieren, die nicht von Dir im Quelltext
programmiert wurden. Du müßtest also dem Maschinencode untersuchen, um
sagen zu können, ob das mit dem untersuchten Kompilat Nebeneffekt frei
klappt oder nicht. Wenn es bei einem bestimmten Kompiler mit einer
bestimmten Einstellung funktioniert, heißt das nicht, daß es bei anderen
Einstellungen bzw. einem anderen Compiler ebenfalls funktioniert.
|
Ich verstehe kein Wort (kann auch an mir liegen .
mfg Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Robitzki Guest
|
Posted: Fri Apr 09, 2004 8:48 pm Post subject: Re: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
Hallo Hans,
Hans Bolte wrote:
| Quote: | Hallo,
kann man aus einem Konstruktor mit Argumenten heraus zunächst den
Standardkonstruktor "durchlaufen lassen" (um nicht so viel doppelt zu
programmieren)?
Wie wäre da die Synthax?
|
in dem Du Deine ganzen Daten in eine eigene Klasse verschiebst, mit
einem default Konstruktor versiehst und davon privat erbst. Nach dem der
"Standardkonstruktor" der Basisklasse nun die Daten initalisert hat,
kannst Du sie nun im Konstruktor der abgeleiteten Klasse ändern.
Die Frage, nach solchen Möglichkeiten ist aber meistens ein Zeichen für
ein Problem im Design. Sprich die Klasse ist zu fett.
mfg Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Apr 09, 2004 9:15 pm Post subject: Re: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
Hans Bolte <hanswilhelmbolte (AT) t-online (DOT) de> writes:
| Quote: | kann man aus einem Konstruktor mit Argumenten heraus zunächst den
Standardkonstruktor "durchlaufen lassen" (um nicht so viel doppelt zu
programmieren)?
|
Noch nicht. Es wird aber diskutiert für den nächsten ISO C++ Standard.
| Quote: | Wie wäre da die Synthax?
|
Vermutlich etwas in der Art von
A::A()
: myI(0)
{
// ...
}
A::A(int i)
: A()
, myI(i)
{
}
Der Teufel liegt im Detail. Z.B. ist unklar, wann ein mit dem zweiten
Konstruktor initialisiertes A-Objekt als vollständig konstruiert zu
betrachten ist.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Frank Birbacher Guest
|
Posted: Fri Apr 09, 2004 10:16 pm Post subject: Re: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
Hi!
Thomas Maeder wrote:
| Quote: | Vermutlich etwas in der Art von
A::A()
: myI(0)
{
// ...
}
A::A(int i)
: A()
, myI(i)
{
}
Der Teufel liegt im Detail. Z.B. ist unklar, wann ein mit dem zweiten
Konstruktor initialisiertes A-Objekt als vollständig konstruiert zu
betrachten ist.
|
Ich würde ja in der Initialisierungsliste höchstens einen "Aufruf" eines Konstruktors derselben Klasse zulassen, oder halt das Übliche:
#include <iostream>
#include <ostream>
struct Foo
{
int i, j;
Foo()
: i((cout << "2 "),
{
j = 9;
cout << "3 ";
}
Foo(int i_)
: Foo() //nicht mehr
{
i = i_;
cout << "4 ";
}
Foo(int i_, int j_)
: Foo((cout << "1 "), i_)
{
j = j_;
cout << "5 ";
}
};
int main()
{
const Foo f(6, 7);
cout << f.i << ' ' << f.j;
}
Ausgabe: "1 2 3 4 5 6 7"
Hier übernimmt genau ein Konstruktor das Konstruieren der members. Nicht irgendwie halbe-halbe, oder so. Ganz einfach.
Frank
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Sat Apr 10, 2004 12:09 am Post subject: Re: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
On Fri, 09 Apr 2004 09:53:33 +0200, Hans Bolte
<hanswilhelmbolte (AT) t-online (DOT) de> wrote:
| Quote: | Hallo,
kann man aus einem Konstruktor mit Argumenten heraus zunächst den
Standardkonstruktor "durchlaufen lassen" (um nicht so viel doppelt zu
programmieren)?
|
In Object-Pascal/Delphi, aber in C++ (bisher) nicht.
| Quote: | Wie wäre da die Synthax?
|
inherited init; { }
( Syntax )
--
Horst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Sat Apr 10, 2004 7:02 pm Post subject: Re: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
Frank Birbacher <bloodymir.crap (AT) gmx (DOT) net> writes:
| Quote: | Der Teufel liegt im Detail. Z.B. ist unklar, wann ein mit dem zweiten
Konstruktor initialisiertes A-Objekt als vollständig konstruiert zu
betrachten ist.
Ich würde ja in der Initialisierungsliste höchstens einen "Aufruf" eines
Konstruktors derselben Klasse zulassen, oder halt das Übliche:
#include
#include
struct Foo
{
int i, j;
Foo()
: i((cout << "2 "),
{
j = 9;
cout << "3 ";
}
Foo(int i_)
: Foo() //nicht mehr
{
i = i_;
cout << "4 ";
}
|
Das beantwort aber meine obige Frage nicht. std::cout << 4 kann eine Exception
werfen. Ist in diesem Fall das Foo-Objekt bereits vollständig konstruiert?
D.h. wird sein Destruktor aufgerufen?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Frank Birbacher Guest
|
Posted: Mon Apr 12, 2004 7:42 pm Post subject: Re: Standardkonstruktor in Spezialkonstruktor verwenden? |
|
|
Hallo Thomas!
Thomas Maeder wrote:
| Quote: | Das beantwort aber meine obige Frage nicht. std::cout << 4 kann eine Exception
werfen. Ist in diesem Fall das Foo-Objekt bereits vollständig konstruiert?
D.h. wird sein Destruktor aufgerufen?
|
Ok, jetzt weiß ich was Du meinst. Das ist wirklich ein Problem. Einmal sollte man den Dtor nicht aufrufen, weil man sich ja im Ktor befindet. Andererseits ist ja schon ein Ktor fertig, daher das Objekt komplett konstruiert, also müsste man auch den Dtor aufrufen.
Ich tendiere zu letzerem. Ich sehe den "geschindelten" Ktor als Funktion, die eine Instanz der Klasse liefert, also:
struct Foo
{
int i, j;
Foo()
: i((cout << "2 "),
{
j = 9;
cout << "3 ";
}
static Foo getFoo(int i_)
{
Foo tmp;
tmp.i = i_;
cout << "4 ";
}
//...
};
Würde man hier die statische Funktion als Ktor schreiben (wie in der letzten Nachricht), dann spart man sich die Kopie des Rückgabewertes (die gute Compiler auch bei dieser statischen Funktion weg optimieren).
Frank
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| 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
|
|