frage zu copy-konstruktor ...
-
hi,
ich habe folgendes problem und hoffe jemand hat einen tip:
fuer folgende klasse brauche ich einen copy konstruktor (siehe schon bereits geschriebenen copy konstr:
class Board { public: Board(){} Board(const Board & b) { pawns = b.pawns ; knights = b.knights ; bishops = b.bishops ; rooks = b.rooks ; queens = b.queens ; kings = b.kings ; occupied_co[0] = b.occupied_co[0] ; occupied_co[1] = b.occupied_co[1] ; occupied = b.occupied ; occupied_l90 = b.occupied_l90 ; occupied_l45 = b.occupied_l45 ; occupied_r45 = b.occupied_r45 ; for(uint i=0; i<64; i++) piece[i] = b.piece[i] ; ply = b.ply ; stm = b.stm ; ksq[0] = b.ksq[0] ; ksq[1] = b.ksq[1] ; epfile = b.epfile ; castle = b.castle ; } BitBoard pawns; BitBoard knights; BitBoard bishops; BitBoard rooks; BitBoard queens; BitBoard kings; BitBoard occupied_co[2]; BitBoard occupied; BitBoard occupied_l90; BitBoard occupied_l45; BitBoard occupied_r45; uchar piece[64]; uint ply; uchar stm; uchar ksq[2]; uchar epfile; uchar castle; };"BitBoard" ist uebrigens ein __int64 (64-Bit-Integer).
Nun habe ich mit obigen code das problem dass ich an einer stelle in meinem programm sowas mache:
// ... das Objekt b soll als original fuer eine kopie dienen Board temp_b = b; // ...allerdings sind nach dieser anweisung anscheinend nicht alle member gleich. (muss ich vielleicht noch den = operator ueberladen, oder habe ich die kopien falschb durchgefuehrt?!?!)
fuer die tipps vorab danke.
gruss.
-
peperony schrieb:
allerdings sind nach dieser anweisung anscheinend nicht alle member gleich.
anscheinend? was willst du uns damit sagen? welche member sind nicht gleich? wo und wie unterscheiden sie sich?
-
peperony schrieb:
(muss ich vielleicht noch den = operator ueberladen
Ja, musst du, jedenfalls wenn du das machst:
Board temp_b = b;Das ruft nämlich zuerst den Default-Ctor und dann den (momentan vom Compiler automatisch generierten) Zuweisungs-operator auf.
Das hingegen
Board temp_b(b);ruft direkt den Copy-Ctor auf, den du ja bereits implementiert hast.
Deine Klasse ist übrigens nicht gerade fetters OOP, wieso hast du die Datenelemente nicht private und getter und setter Methoden drauf?
Bye
-
Erstens, bei
Typ a = b;wird der Kopierkonstruktor, _nicht_ der op= aufgerufen. Bei
Typ a; a = b;wird der op= aufgerufen.
Zweitens, beide werden automatisch generiert, wenn dus nicht absichtlich unterbindest. Das heißt, wenn die Aufgabe deines Kopierkonstruktors oder op= daraus besteht, alle Datenelemente zu kopieren oder zuzuweisen, kannst du ihn genausogut weglassen - dann hast du immerhin nicht die Gefahr, etwas zu vergessen.