Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Problem mit dem operator= ?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Tantor
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2002
Beiträge: 125
Beitrag Tantor Mitglied 10:54:00 14.05.2003   Titel:   Problem mit dem operator= ?            Zitieren

Hallo zusammen,

also meine Klasse sieht wie folgt aus :

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
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 :

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 :

C++:
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 ??
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 25705
Beitrag volkard Moderator 11:00:00 14.05.2003   Titel:              Zitieren

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

_________________
ewr-dienstleister krankenversicherung
HumeSikkins
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.08.2000
Beiträge: 11139
Beitrag HumeSikkins Mitglied 11:31:00 14.05.2003   Titel:              Zitieren

Zitat:
am zuweisungsoperator ist kein fehler

Naja. Also ich sehe einen schmerzhaften und einen den man als Stilfehler abtun könnte.

_________________
Remember Sturgeon's Law:
"Ninety percent of everything is crap."
and now go visit my Homepage ;-)
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 25705
Beitrag volkard Moderator 11:39:00 14.05.2003   Titel:              Zitieren

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.

_________________
ewr-dienstleister krankenversicherung
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18947
Beitrag Shade Of Mine Moderator 15:23:00 14.05.2003   Titel:              Zitieren

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

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 25705
Beitrag volkard Moderator 16:39:00 14.05.2003   Titel:              Zitieren

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

_________________
ewr-dienstleister krankenversicherung
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18947
Beitrag Shade Of Mine Moderator 16:43:00 14.05.2003   Titel:              Zitieren

Zitat:
Original erstellt von volkard:
nee. so kompliziert sollte mein code gar nicht sein.


das geht noch einfacher??
nur her damit bitte!!

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 25705
Beitrag volkard Moderator 17:06:00 14.05.2003   Titel:              Zitieren

tipp einfach keinen copy-konstruktor ein. der compiler machts dirs schon recht.

_________________
ewr-dienstleister krankenversicherung
c++.de :: C++ (auch C++0x und C++11) ::  Problem mit dem operator= ?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.