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 

Ursprungsoperator= (von Objekten) aufrufen, wenn operator= ü

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





PostPosted: Mon Apr 17, 2006 6:11 pm    Post subject: Ursprungsoperator= (von Objekten) aufrufen, wenn operator= ü Reply with quote



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





PostPosted: Mon Apr 17, 2006 10:06 pm    Post subject: Re: Ursprungsoperator= (von Objekten ) aufrufen, wenn operat Reply with quote



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





PostPosted: Mon Apr 17, 2006 10:06 pm    Post subject: Re: Ursprungsoperator= (von Objekten) aufrufen, wenn operat Reply with quote



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





PostPosted: Mon Apr 17, 2006 11:06 pm    Post subject: Re: Ursprungsoperator= (von Objekten ) aufrufen, wenn operat Reply with quote

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