 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Martin Höller Guest
|
Posted: Sat Nov 15, 2003 11:42 am Post subject: Zuweisung von Referenzen |
|
|
Hallo!
Ich hab folgendes Problem:
class A
{
.....
A(const A& cpy); //copy constructor selbst implementiert
};
class B
{
public:
setVar(A& new_var) {var_ = new_var;}; //[1]
...
private:
A& var_;
...
};
[1] Hier schimpft der Compiler:
'A' : 'operator =' function is unavailable
Ich möchte einfach eine Referenz von A in B halten können...
Den =-Operator hab ich in A nicht implementiert. Halte ich auch nicht
für nötig. Wie kann ich das lösen?
Danke für die Tipps.
mfg, martin
PS: Ich verwende VC6 (Ja, ich weiß schon. Ich hab den g++ auch viel mehr
lieb...)
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Sat Nov 15, 2003 1:15 pm Post subject: Re: Zuweisung von Referenzen |
|
|
"Martin Höller" <martin.hoeller (AT) inode (DOT) at> schrieb:
| Quote: | class B
{
public:
setVar(A& new_var) {var_ = new_var;}; //[1]
...
private:
A& var_;
...
};
[1] Hier schimpft der Compiler:
'A' : 'operator =' function is unavailable
|
Er sollte eigentlich scho vorher schimpfen, weil eine Referenz nicht
initialisiert wurde. Man kann Refernzen nicht mehr umbiegen, nachdem
sie einmal existieren. Wohin eine Referenz zeigt, kann (und muß)
während der Initialisierung festgelegt werden:
int i = 3;
int& ri( i ); // Initialisierung: ri ist ein Alias für i
ri = 4; // äquivalent: i = 4
int& r2i = ri; // noch ein Alias für i
// Auch das ist Initialisierung! Keine Zuweisung.
int& r3i; // Fehler: Referenz nicht initialisiert
extern int& r4i; // Ok. Referenz wird in einer anderen Übersetzungs-
// einheit initialisiert.
Du mußt A::var_ also initialisieren. Element-Variablen werden in der
Initialisierungsliste (Surprise!) eines C'tor initialisiert:
B::B(A& new_var) var_(new_var} {}
Später kann diese Referenz nicht umgebogen werden. Wenn Du das
wirklich willst, verwende statt einer Referenz einen Zeiger!
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Sat Nov 15, 2003 2:05 pm Post subject: Re: Zuweisung von Referenzen |
|
|
Martin Höller wrote:
| Quote: | Hallo!
Ich hab folgendes Problem:
class A
{
....
A(const A& cpy); //copy constructor selbst implementiert
};
class B
{
public:
setVar(A& new_var) {var_ = new_var;}; //[1]
...
private:
A& var_;
...
};
[1] Hier schimpft der Compiler:
'A' : 'operator =' function is unavailable
Ich möchte einfach eine Referenz von A in B halten können...
Den =-Operator hab ich in A nicht implementiert. Halte ich auch nicht
für nötig. Wie kann ich das lösen?
|
Gar nicht. Einer Referenz kann man nichts zuweisen. Beim Erzeugen der
Referenz muß diese mit einem Objekt initialisiert werden, und auf
dieses Objekt verweist sie dann so lange, wie sie existiert. Die
Zuweisung oben weist nur dem Objekt, auf das var_ verweist, den Wert
vom Objekt, auf das new_var verweist, zu.
Verwende statt einer Referenz einfach einen Zeiger als Member.
--
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 |
|
 |
Alexander Bartolich Guest
|
Posted: Sat Nov 15, 2003 6:29 pm Post subject: Re: Zuweisung von Referenzen |
|
|
begin Martin Höller:
| Quote: | Hier schimpft der Compiler:
'A' : 'operator =' function is unavailable
|
Eine Referenz verweist während ihrer gesamten Lebensdauer auf ein
und das selbe Objekt. Man kann Referenzen nicht zuweisen. Punkt.
Wenn man das will, will man einen Zeiger.
http://www.parashift.com/c++-faq-lite/references.html#faq-8.5
--
Für Google, Tux und GPL!
--
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 |
|
 |
Florian Weimer Guest
|
Posted: Sat Nov 15, 2003 10:48 pm Post subject: Re: Zuweisung von Referenzen |
|
|
Rolf Magnus <ramagnus (AT) t-online (DOT) de> writes:
| Quote: | Gar nicht. Einer Referenz kann man nichts zuweisen.
|
Man könnte aber den Destruktor der ganzen Klasse aufrufen und mittes
placement new ein neues Objekt mit der richtigen Referenz anlegen. 8->
--
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 |
|
 |
Kostka, Volkmar Guest
|
Posted: Sun Nov 16, 2003 12:15 am Post subject: Re: Zuweisung von Referenzen |
|
|
Hallo,
Florian Weimer wrote:
| Quote: | Rolf Magnus <ramagnus (AT) t-online (DOT) de> writes:
Gar nicht. Einer Referenz kann man nichts zuweisen.
Man könnte aber den Destruktor der ganzen Klasse aufrufen und mittes
placement new ein neues Objekt mit der richtigen Referenz anlegen. 8-
|
Wirst du aber kaum in einem Kopierkonstruktor oder Zuweisungsoperator
machen. :-)
MFG
Volkmar Kostka
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Sun Nov 16, 2003 11:16 am Post subject: Re: Zuweisung von Referenzen |
|
|
"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb:
| Quote: | Foo& Foo::operator=(const Foo& rhs)
{
this->~Foo();
new(this) Foo(rhs);
}
Ob das nun guter Stil ist, ist eine andere Frage.
|
Wenn der C'tor werfen kann, ist es Murks. Schlecht ist es auch
sonst, weil beim Aufruf der C'tors & D'tors mehr geschieht, als
nur die vom Programmierer definierte Funktion abzuarbeiten.
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Sun Nov 16, 2003 11:56 am Post subject: Re: Zuweisung von Referenzen |
|
|
Kostka, Volkmar wrote:
| Quote: |
Hallo,
Florian Weimer wrote:
Rolf Magnus <ramagnus (AT) t-online (DOT) de> writes:
Gar nicht. Einer Referenz kann man nichts zuweisen.
Man könnte aber den Destruktor der ganzen Klasse aufrufen und mittes
placement new ein neues Objekt mit der richtigen Referenz anlegen.
8-
Wirst du aber kaum in einem Kopierkonstruktor oder Zuweisungsoperator
machen.
|
Im Kopierkonstruktor natürlich nicht, aber im Zuweisungsoperator wird
das tatsächlich manchmal gemacht, in der Art:
Foo& Foo::operator=(const Foo& rhs)
{
this->~Foo();
new(this) Foo(rhs);
}
Ob das nun guter Stil ist, ist eine andere Frage.
--
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
|
|