 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Brian Finn Guest
|
Posted: Fri Apr 07, 2006 12:06 pm Post subject: Konstruktoren |
|
|
Hi!
Folgender Code funktioniert nicht, ich weiß aber leider nicht, warum.
class Test
{
int mx, my;
public:
Test() { Test(1); }
Test(int x) { Test(x, 2); }
Test(int x, int y) { mx = x; my = y;}
void show() { cout << "x: " << mx << " y: " << my << endl; }
};
int main()
{
Test t;
t.show();
Test tt(1,2);
tt.show();
}
t.show() söllte eigentlich "x: 1 y: 2" ausgeben.
Gibt aber "x: -858993460 y: -858993460" aus.
tt.show() gibt das richtige aus.
Wer weiß rat?
MfG
Brian Finn
--
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 |
|
 |
Jakob Bieling Guest
|
Posted: Fri Apr 07, 2006 12:06 pm Post subject: Re: Konstruktoren |
|
|
Brian Finn <bfinn (AT) tiscali (DOT) de> wrote:
| Quote: | Folgender Code funktioniert nicht, ich weiß aber leider nicht, warum.
class Test
{
int mx, my;
public:
Test() { Test(1); }
|
In diesem constructor erstellst du ein temporaeres Objekt, welches
durch den 'Test(int x)' constructor erstellt wird. Das geht allerdings
auch gleich wieder kaputt, wenn der obige constructor verlassen wird.
| Quote: | Test(int x) { Test(x, 2); }
|
Aehnliches passiert hier.
| Quote: | Test(int x, int y) { mx = x; my = y;}
|
Mit anderen Worten, du kannst einen constructor nicht aufrufen, da
es keine Funktion im gewoehnlichen Sinne ist. In deinem einfachen
Beispiel ist es am besten, du benutzt fuer alle drei die initializer
list. In etwa so:
Test () : mx (1), my (2) {}
Test (int x) : mx (x), my (2) {}
Test (int x, int y) : mx (x), my (y) {}
Fuer komplexere Sachen solltest du die gemeinsame
constructor-Funktionalitaet in eine gesonderte Funktion packen, die du
in allen constructors aufrufst:
void constuct (int x = 1, int y = 2) { mx = x; my = y; }
Test () { construct (); }
Test (int x) { construct (x); }
Test (int x, int y) { construct (x, y); }
hth
--
jb
(reply address in rot13, unscramble first)
--
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 |
|
 |
Michael Karcher Guest
|
Posted: Fri Apr 07, 2006 12:06 pm Post subject: Re: Konstruktoren |
|
|
Brian Finn <bfinn (AT) tiscali (DOT) de> wrote:
| Quote: | Folgender Code funktioniert nicht, ich weiß aber leider nicht, warum.
class Test
{
int mx, my;
public:
Test() { Test(1); }
Test(int x) { Test(x, 2); }
Test(int x, int y) { mx = x; my = y;}
[...] |
Du kannst in C++ keine Konstruktoren delegieren. Aber das, was Du in diesem
Beispiel erreichen willst, geht per
Test(int x = 1, int y = 2) { mx = x; my = y; }
Der von Dir geschriebene Konstruktor Test() lässt die Variablen mx und
my uninitialisiert, und wertet den Ausdruck Test(1) aus, bei dem die Zahl
1 mit Hilfe des zweiten Konstruktors von Test in ein Test-Objekt
konvertiert wird, und das konstruierte Objekt danach entsorgt wird.
Bei eingebauten Typen (also int und ähnliches) ist der von mir oben
geschriebene Konstruktor OK, aber aus stilistischen Gründen, und weil es
bei Objektinstanzen einen erheblichen Unterschied geben kann, sollte man
es als
Test(int x = 1, int y = 2) : mx(x), my(y) {}
schreiben.
Die hier verwendete Syntax heißt "Initialisierung", wodurch die Variablen
mx und my gleich bei ihrer "Erzeugung" mit dem richtigen Wert angelegt werden,
wogegen die Zuweisung im Konstruktor dazu führt, dass die Variablen vorher
per default-Konstruktor (den es bei eingebauten Typen aber nicht gibt)
konstruiert werden.
Michael Karcher
--
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 |
|
 |
Heinz Ozwirk Guest
|
Posted: Fri Apr 07, 2006 12:06 pm Post subject: Re: Konstruktoren |
|
|
"Brian Finn" <bfinn (AT) tiscali (DOT) de> schrieb im Newsbeitrag news:e15i1j$1qbr$1 (AT) ulysses (DOT) news.tiscali.de...
| Quote: | Hi!
Folgender Code funktioniert nicht, ich weiß aber leider nicht, warum.
class Test
{
int mx, my;
public:
Test() { Test(1); }
|
Konstruktoren sind keine normalen Funktionen, die man einfach wie eine normale Member-Funktion aufrufen kann. Der Aufruf Test(1) erzeugt ein neues Objekt, ruft dessen Konstruktor Test(int) auf und zerstört das Objekt sofort wieder. Das Objekt, in dessen Konstruktor der Aufruf steht, wird davon überhaupt nicht beeinflusst.
Wenn du in mehreren Konstruktoren das gleiche machen willst, brauchst du dafür eine richtige Funktion, die in allen Konstruktoren aufgerufnen wird. (s.u.)
| Quote: | Test(int x) { Test(x, 2); }
Test(int x, int y) { mx = x; my = y;}
void show() { cout << "x: " << mx << " y: " << my << endl; }
};
|
Besser wäre es, die Klasse so umzuschreiben
class Test
{
int mx;
int my;
void Init(int x = 1, int y = 2)
{
mx = x;
my = y;
}
public:
Test() { Init(); }
Test(int x) { Init(x); }
Test(int x, int y) { Init(x, y); }
...
};
Natürlich kann man auf die Default-Parameter von Init auch verzichten. Dann muss man halt Init(1, 2) bzw. Init(x, 2) schreiben.
Heinz
--
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 07, 2006 2:06 pm Post subject: Re: Konstruktoren |
|
|
Hallo Brian,
Brian Finn wrote:
| Quote: | Hi!
Folgender Code funktioniert nicht, ich weiß aber leider nicht, warum.
class Test
{
int mx, my;
public:
Test() { Test(1); }
Test(int x) { Test(x, 2); }
Test(int x, int y) { mx = x; my = y;}
void show() { cout << "x: " << mx << " y: " << my << endl; }
};
|
neben den Lösungn der anderen Kollegen, gibt es auch noch die
Möglichkeit, die Daten in eine Private Basisklasse zu verlegen. Diese
Lösung hätte Vorteile, wenn Variablen des Objektes keinen default
Konstruktor haben oder die Sequenz von Konstruieren und Zuweisen zu
teuer wird.
struct data
{
data(int x, int y)
: mx(x)
, my(y)
{}
};
class Test : data
{
public:
Test() : data(1,2) {}
explicit Test(int x) : data(x,2) {}
Test(int x, int y) : data(x,y) {}
};
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 |
|
 |
Jakob Bieling Guest
|
Posted: Fri Apr 07, 2006 4:05 pm Post subject: Re: Konstruktoren |
|
|
Jakob Bieling <argfhesNGtzkQBGarg (AT) rot13 (DOT) com> wrote:
| Quote: | Brian Finn <bfinn (AT) tiscali (DOT) de> wrote:
Test() { Test(1); }
In diesem constructor erstellst du ein temporaeres Objekt, welches
durch den 'Test(int x)' constructor erstellt wird. Das geht allerdings
auch gleich wieder kaputt, wenn der obige constructor verlassen wird.
|
Genauer gesagt geht es sofort kaputt. War da etwas ungenau, weil
sich das in diesem speziellen Fall nich wirklich viel nimmt.
--
jb
(reply address in rot13, unscramble first)
--
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
|
|