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 

Konstruktoren

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





PostPosted: Fri Apr 07, 2006 12:06 pm    Post subject: Konstruktoren Reply with 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; }
};

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





PostPosted: Fri Apr 07, 2006 12:06 pm    Post subject: Re: Konstruktoren Reply with quote



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





PostPosted: Fri Apr 07, 2006 12:06 pm    Post subject: Re: Konstruktoren Reply with quote



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





PostPosted: Fri Apr 07, 2006 12:06 pm    Post subject: Re: Konstruktoren Reply with quote

"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





PostPosted: Fri Apr 07, 2006 2:06 pm    Post subject: Re: Konstruktoren Reply with quote

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





PostPosted: Fri Apr 07, 2006 4:05 pm    Post subject: Re: Konstruktoren Reply with quote

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
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.