Problem mit dem operator= ?
-
Hallo zusammen,
also meine Klasse sieht wie folgt aus :
class Spielbrett { private: int AnzahlReihen; int MaxAnzahlMuenzen; int* Brett; int MuenzenAufBrett; public: Spielbrett(void); ~Spielbrett(void); Spielbrett& operator=(const Spielbrett& SBrett); };
meine Definition für die Überladung so :
Spielbrett& Spielbrett::operator=(const Spielbrett& SBrett) { if ( this != &SBrett ) { AnzahlReihen = SBrett.AnzahlReihen; MaxAnzahlMuenzen= SBrett.MaxAnzahlMuenzen; MuenzenAufBrett = SBrett.MuenzenAufBrett; Brett = new int[AnzahlReihen]; for ( short i = 0 ; i < AnzahlReihen ; i++ ) { Brett[i]=SBrett.Brett[i]; } } return *this; }
So, wenn ich jetzt in meiner Methode folgendes gesagt habe :
Spielbrett Brett2 = SBrett;
und der beim Verlassen der Methode dann Brett2 wegräumen will, ist aufeinmal auch der Inhalt von SBrett weg, kann das sein ??
-
und der beim Verlassen der Methode dann Brett2 wegräumen will, ist aufeinmal auch der Inhalt von SBrett weg, kann das sein ??
ja, schon. du hast nen copy-konstruktor aufgerufen aber nen nen zuweisungsoperator definiert. am zuweisungsoperator ist kein fehler, aber er wird bei ner initialisierung wie "Spielbrett Brett2 = SBrett;" nicht aufgerufen.
-
am zuweisungsoperator ist kein fehler
Naja. Also ich sehe einen schmerzhaften und einen den man als Stilfehler abtun könnte.
-
mangelnde exceptionfestigkeit und ein speicherloch.
ok, kein fehler, der was mit dem beschriebenen problem zu tun hat.
der eigentliche stilfehler ist, daß für Spielbrett überhaupt new benutzen muß, statt ne array-klasse fürs attribut Brett zu nehmen.
ich wollt's hier noch nicht verraten.
-
/me steht ja auf:
Spielbrett& Spielbrett::operator=(Spielbrett SBrett)
{
swap(SBrett);
}wobei swap intern nur die member vars tauscht (also nur pointer tausch, statt speicher kopieren)
und mit volkards 'Trick' sieht der copy ctor dann so aus:
Spielbrett::Spielbrett(const Spielbrett& SBrett)
:
Brett(SBrett.Brett),
MuenzenAufBrett(MuenzenAufBrett)
{
}MaxAnzahlMuenzen bekommt man über Brett.maxSize() und AnzahlReihen kann man auch aus Brett.size() ablesen. (oder ähnliches)
so wird der code schön lokal gehalten und man muss nicht jedesmal n eigenes speicher management schreiben, sondern verwendet jedesmal ein (dem bedürfnis angepasste) Array Klasse.
-
Original erstellt von Shade Of Mine:
**und mit volkards 'Trick' sieht der copy ctor dann so aus:
Spielbrett::Spielbrett(const Spielbrett& SBrett)
:
Brett(SBrett.Brett),
MuenzenAufBrett(MuenzenAufBrett)
{
}
**nee. so kompliziert sollte mein code gar nicht sein.
-
Original erstellt von volkard:
nee. so kompliziert sollte mein code gar nicht sein.das geht noch einfacher??
nur her damit bitte!!
-
tipp einfach keinen copy-konstruktor ein. der compiler machts dirs schon recht.