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.


Anmelden zum Antworten