 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jochen Giese Guest
|
Posted: Mon Apr 17, 2006 6:11 pm Post subject: Ursprungsoperator= (von Objekten) aufrufen, wenn operator= ü |
|
|
Hallo,
Ich hab folgendes Problem, ich will den Operator = überladen, so zB:
Code:
Fahrzeug& Fahrzeug::operator =(Fahrzeug& fahrzeug2){
int iTemp = p_iID;
*this = fahrzeug2; //rekursiver Aufruf
p_iID = iTemp;
return *this;
}
Probleme ist, das die ID bei einem Aufruf "fahrzeug1 = fahrzeug2;" behalten
werden muss, und so dachte ich überlad den =-Operator. Jetzt will ich in der
Überladungsfunktion nicht gerade jede Variable einzeln kopieren sondern
irgendwie die Ursprungsmethode des Operators laden. So wie es jetzt
geschrieben ist, ist es ja eine Rekursive-Methode.
Könnt ihr mir hier helfen, gibt es da ne Möglichkeit?
Was würdet Ihr mir empfehlen,
Ich bin euch schonmal im Voraus recht dankbar.
Mit freundlichen Grüßen
Jochen Giese
--
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 |
|
 |
Marcel Müller Guest
|
Posted: Mon Apr 17, 2006 10:06 pm Post subject: Re: Ursprungsoperator= (von Objekten ) aufrufen, wenn operat |
|
|
Hallo.
Jochen Giese schrieb:
| Quote: | Hallo,
Ich hab folgendes Problem, ich will den Operator = überladen, so zB:
Code:
Fahrzeug& Fahrzeug::operator =(Fahrzeug& fahrzeug2){
^^^ const Fahrzeug& !
int iTemp = p_iID;
*this = fahrzeug2; //rekursiver Aufruf
p_iID = iTemp;
return *this;
}
Probleme ist, das die ID bei einem Aufruf "fahrzeug1 = fahrzeug2;" behalten
werden muss, und so dachte ich überlad den =-Operator. Jetzt will ich in der
Überladungsfunktion nicht gerade jede Variable einzeln kopieren sondern
irgendwie die Ursprungsmethode des Operators laden. So wie es jetzt
geschrieben ist, ist es ja eine Rekursive-Methode.
Könnt ihr mir hier helfen, gibt es da ne Möglichkeit?
Was würdet Ihr mir empfehlen,
|
Jede Variable einzeln zuweisen!
Wenn der operator= überladen ist, /gibt/ es keinen Ursprungsoperator.
Der Compiler generiert nämlich einen operator= dann und nur dann
rekursiv aus den gleichnamigen Operatoren der Elemente, wenn dieser
/nicht/ überladen wurde.
Die einzige Alternative, wenn einem dass zu nervig ist, wäre Vererbung
zusammen mit slicing.
class Base
{ // alle Eigenschaften bis auf ID.
};
class Derived
{ int ID;
operator=(const Derived& r)
{ base::operator=(r); }
};
Marcel
--
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 |
|
 |
Stefan Reuther Guest
|
Posted: Mon Apr 17, 2006 10:06 pm Post subject: Re: Ursprungsoperator= (von Objekten) aufrufen, wenn operat |
|
|
Jochen Giese wrote:
| Quote: | Code:
Fahrzeug& Fahrzeug::operator =(Fahrzeug& fahrzeug2){
int iTemp = p_iID;
*this = fahrzeug2; //rekursiver Aufruf
p_iID = iTemp;
return *this;
}
Probleme ist, das die ID bei einem Aufruf "fahrzeug1 = fahrzeug2;" behalten
werden muss, und so dachte ich überlad den =-Operator.
|
Du möchtest den compilergenerierten Operator nutzen? Das geht nicht,
weil der Compiler ja keinen mehr für deine Klasse generiert, wenn du
einen schreibst.
Workaround ist im allgemeinen, die entsprechenden Daten in eine Struktur
'Representation' o.ä. zu packen.
class Fahrzeug {
struct Rep {
int anzahl_raeder;
int hubraum_ccm;
int power_kw;
};
int id;
Rep rep;
// ...
};
Fahrzeug& Fahrzeug::operator=(const Fahrzeug& f2) {
rep = f2.rep;
return *this;
}
Stefan
--
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 |
|
 |
Jörg Barfurth Guest
|
Posted: Mon Apr 17, 2006 11:06 pm Post subject: Re: Ursprungsoperator= (von Objekten ) aufrufen, wenn operat |
|
|
Hi,
Jochen Giese schrieb:
| Quote: | Ich hab folgendes Problem, ich will den Operator = überladen, so zB:
Code:
Fahrzeug& Fahrzeug::operator =(Fahrzeug& fahrzeug2){
int iTemp = p_iID;
*this = fahrzeug2; //rekursiver Aufruf
p_iID = iTemp;
return *this;
}
Probleme ist, das die ID bei einem Aufruf "fahrzeug1 = fahrzeug2;" behalten
werden muss, und so dachte ich überlad den =-Operator. Jetzt will ich in der
Überladungsfunktion nicht gerade jede Variable einzeln kopieren sondern
irgendwie die Ursprungsmethode des Operators laden. So wie es jetzt
geschrieben ist, ist es ja eine Rekursive-Methode.
Könnt ihr mir hier helfen, gibt es da ne Möglichkeit?
Was würdet Ihr mir empfehlen,
|
Die einfachste Methode ist alle Member von Fahrzeug, außer der ID, in
eine struct (evtl. private innerhalb von Fahrzeug definiert) zu packen.
Diese kannst du dann mit einer Zuweisung zuweisen.
Tip: bei der von Dir beabsichtigten Semantik von p_iID solltest du
dieses Member 'const' deklarieren -damit verhinderst du auch dass aus
Versehen ein falscher compilergenerierter Zuweisungsoperator den Wert
verändert.
Beispiel:
class Fahzeug
{
struct Daten
{
// evtl auch Konstruktor(en) bereitstellen
string kennzeichen;
string hersteller;
unsigned int typkennzahl;
unsigned int PS;
};
Daten daten;
const int p_iID;
public:
// braucht Konstruktoren, die p_iID initialisieren
Fahrzeug & operator=(const /*meist richtiger*/ Fahrzeug& fahrzeug2)
{
this->daten = fahrzeug2.daten;
return *this;
}
string kennzeichen() const { return this->daten.kennzeichen; }
};
HTH, Jörg
--
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
|
|