 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jan Boehme Guest
|
Posted: Tue Sep 09, 2003 12:32 pm Post subject: Zuweisung |
|
|
Hallo!
Ich habe ein Problem mit einem Zuweisungsoperator. Ich habe hier zwei
Beispiele, und wüsste gern, warum das eine funktioniert, das andere
jedoch nicht.
//B1 schlägt fehl
CNode _n1 = _element.GetFirstNode();
//B2 funktioniert
CNode _n2;
_n2 = _element.GetFirstNode();
Ich kann mir vorstellen, dass in B1 im Gegensatz zu B2 kein
Standardkonstruktor aufgerufen wird. Da jedoch Speicher dynamisch
verwaltet wird, sind die Werte der Member wichtig und daher auch ihre
ordnungsgemäße Initialisierung.
Was muss ich tun, dass auch in B1 der Standardkonstruktor aufgerufen wird?
Danke, Jan.
--
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 |
|
 |
Lutz Jacob Guest
|
Posted: Tue Sep 09, 2003 5:28 pm Post subject: Re: Zuweisung |
|
|
On Tue, 09 Sep 2003 14:32:32 +0200, Jan Boehme wrote:
| Quote: | //B1 schlägt fehl
CNode _n1 = _element.GetFirstNode();
|
Hier steht eigentlich keine Zuweisung, sondern der Copy-Konstruktor. Wenn
Du mit dynamischem Speicher arbeitest, musst Du den auf jeden Fall auch
sinnvoll definieren.
| Quote: | //B2 funktioniert
CNode _n2;
_n2 = _element.GetFirstNode();
|
Hier hast Du Standardkonstruktor und anschließend Zuweisung.
| Quote: | Standardkonstruktor aufgerufen wird. Da jedoch Speicher dynamisch
verwaltet wird, sind die Werte der Member wichtig und daher auch ihre
ordnungsgemäße Initialisierung.
Was muss ich tun, dass auch in B1 der Standardkonstruktor aufgerufen wird?
|
Du wirst kaum um zwei Konstruktoren herumkommen. Ganz allgemein kann man
sagen, dass zu Klassen, die intern dynamisch Objekte anlegen, mindestens
die zwei Konstruktoren, der Zuweisungsoperator und der Destruktor gehören.
ciao
Lutz
--
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 |
|
 |
Martin Winkler Guest
|
Posted: Tue Sep 09, 2003 5:33 pm Post subject: Re: Zuweisung |
|
|
Jan Boehme schrieb:
| Quote: | Hallo!
Ich habe ein Problem mit einem Zuweisungsoperator. Ich habe hier zwei
Beispiele, und wüsste gern, warum das eine funktioniert, das andere
jedoch nicht.
//B1 schlägt fehl
CNode _n1 = _element.GetFirstNode();
//B2 funktioniert
CNode _n2;
_n2 = _element.GetFirstNode();
|
Was aus Deinem Code nicht hervorgeht, mir meine Glaskugel aber sagt:
_element.GetFirstNode() liefert ein Objekt vom Typ CNode.
| Quote: | Ich kann mir vorstellen, dass in B1 im Gegensatz zu B2 kein
Standardkonstruktor aufgerufen wird.
|
In der Tat. Unter der Annahme, die ich mit meiner Glaskugel getroffen
habe, wird der Kopierkonstruktor benutzt.
| Quote: | Da jedoch Speicher dynamisch
verwaltet wird, sind die Werte der Member wichtig und daher auch ihre
ordnungsgemäße Initialisierung.
|
Sehr richtig.
| Quote: | Was muss ich tun, dass auch in B1 der Standardkonstruktor aufgerufen wird?
|
Falsche Frage.
Statt dessen möchtest Du den Kopierkonstruktor der Klasse CNode
ordungsgemäß implementieren. Der ist nämlich in Beispiel 1 gefragt.
Gern geschehen.
Gruß Martin
--
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: Tue Sep 09, 2003 5:51 pm Post subject: Re: Zuweisung |
|
|
Jan Boehme <jb (AT) ype (DOT) de> writes:
| Quote: | Ich habe ein Problem mit einem Zuweisungsoperator. Ich habe hier zwei
Beispiele, und wüsste gern, warum das eine funktioniert, das andere
jedoch nicht.
//B1 schlägt fehl
CNode _n1 = _element.GetFirstNode();
|
Das schlägt primär fehl, weil CNode und _element nicht deklariert sind.
Bitte poste ein minimales Codestück, welches Deine Frage illustriert. D.h.
gerade so viel Code, so dass nur die Fehlermeldung(en) erzeugt werden, um die
es Dir geht.
--
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 |
|
 |
Jan Boehme Guest
|
Posted: Tue Sep 09, 2003 7:56 pm Post subject: Re: Zuweisung |
|
|
Hallo Martin!
Das sind nur Pseudovariablen, -klasse und -funktionen. Du hast alles
richtig gedeutet. Sorry, falls es zu kryptisch war.
Martin Winkler schrieb:
| Quote: | //B1 schlägt fehl
CNode _n1 = _element.GetFirstNode();
//B2 funktioniert
CNode _n2;
_n2 = _element.GetFirstNode();
Statt dessen möchtest Du den Kopierkonstruktor der Klasse CNode
ordungsgemäß implementieren. Der ist nämlich in Beispiel 1 gefragt.
|
CNode _n1 = _element.GetFirstNode();
und
CNode _n1(_element.GetFirstNode());
sind demnach das selbe? Kannst Du mir erklären, warum das so ist? Es
erscheint mir momentan unlogisch.
Das soll natürlich nicht verdrängen, dass mein der Kopiekonstruktor von
CNode tatsächlich nicht richtig arbeiten könnte ;)
Danke, Jan.
--
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 |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Wed Sep 10, 2003 9:12 am Post subject: Re: Zuweisung |
|
|
Jan Boehme wrote:
| Quote: |
Hallo Martin!
Das sind nur Pseudovariablen, -klasse und -funktionen. Du hast alles
richtig gedeutet. Sorry, falls es zu kryptisch war.
Martin Winkler schrieb:
//B1 schlägt fehl
CNode _n1 = _element.GetFirstNode();
//B2 funktioniert
CNode _n2;
_n2 = _element.GetFirstNode();
Statt dessen möchtest Du den Kopierkonstruktor der Klasse CNode
ordungsgemäß implementieren. Der ist nämlich in Beispiel 1 gefragt.
CNode _n1 = _element.GetFirstNode();
und
CNode _n1(_element.GetFirstNode());
sind demnach das selbe? Kannst Du mir erklären, warum das so ist? Es
erscheint mir momentan unlogisch.
|
Du musst zunaechst mal zwischen
* Initialisierung und
* Zuweisung
unterscheiden.
Initialisierung findet immer dann statt, wenn eine Variable "zur Welt kommt"
also neu erzeugt wird.
CNode _n1;
erzeugt eine neue Variable _n1, also findet eine Initialisierung statt.
Weiters: Initialisierung bedeutet immer: ein Konstruktor wird aufgerufen!
D.h. egal was Du bei einer Variablendefintion machst, es muendet immer
im Aufruf eines Konstruktors (built in types wie int, long etc. mal
aussen vor gelassen).
d.h.
CNode _n1 = element.GetFirstNode();
GetFirstNode() wird aufgerufen und mit dem Ergebnis wird ein CNode Konstruktor
aufgerufen, denn: es handelt sich um die Definition einer Variablen, ergo eine
Initialisierung und das wiederum bedeutet: Konstruktor.
CNode _n2; // Eine neue Variable wird erzeugt -> Intialisierung ->
// Konstruktor wird aufgerufen. Da nichts spezielles
// fuer die Initialisierung angegeben wurde -> Default Konstruktor.
_n2 = _element.GetFirstNode(); // Hier exisitier _n2 bereits. Also kann es keine
// Initialisierung sein -> ganz normale Zuweisung.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
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 |
|
 |
Roland Jakobs Guest
|
Posted: Wed Oct 01, 2003 9:26 am Post subject: Re: Zuweisung |
|
|
Jan Boehme schrieb:
| Quote: |
Habe noch was vergessen. "Funktionieren" bezieht sich auf die Linkmodi:
Im Debugmodus läuft es einwandfrei und im Releasemodus gibt es eine
Schutzverletzung, wahrscheinlich weil ein delete [] über ein nicht
initialisiertes dynamisches Feld ausgeführt wird:
if(m_feld)
|
delete auf 0 ist zulässig und macht nichts, die Abfrage ist also
überflüssig.
Falls m_feld nicht initialisiert ist, knallts!
Besser:
int *m_feld = 0;
und beim Löschen
delete [] m_feld;
m_feld = 0; // verhindert double delete
--
Wenn man möchte, daß etwas richtig gemacht wird, dann endet
es im allgemeinen damit, daß man es selber machen muß.
rj
--
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
|
|