011
19.05.2016, 09:17 Uhr
ao
(Operator)
|
Zitat von Noby: |
Eigentlich brauche ich noch eine Zeigerstruktur in der class Move, dass ich im Baum von unten nach oben komme.
|
Das dachte ich mir. Wie wärs mit sowas?
C++: |
class Move { std::string move; // z.B. "Sg1-f3" std::list<Move> nextMoves; // alle möglichen folgenden Züge int rating; // Bewertung des Zugs Move * previousMove; // Rückverweis auf den Vorgänger public:
Move (const std::string & move_ , Move * previousMove_ ) : move (move_), rating (0) , previousMove (previousMove_) {} int Rate (); // Diesen Zug bewerten. Braucht evtl. die Ratings der Folgezüge. };
|
Der Pointer previousMove zeigt auf den Vorgänger, der zur Konstruktionszeit bereits bekannt ist.
Beachte noch das hier: Beim Einfügen in die Listen (oder Vektoren, das ist hier dasselbe) werden die Objekte kopiert (das machen die STL-Container so). Das heißt: Wenn es zum Kopieren eines Moves reicht, die einzelnen Member nacheinander zu kopieren (was momentan der Fall ist), dann brauchst du nichts weiter zu tun, denn das erledigen der Default-Copy-Konstruktor und der Default-operator=, die der Compiler für jede Klasse automatisch bereitstellt.
Wenn das nicht reicht und zusätzliche oder andere Dinge getan werden müssen, dann musst du den Copy-Konstruktor und den operator= selber definieren, und in vielen Fällen brauchst du dann auch einen Destruktor, der die Zerstörung eines Move-Objekts übernimmt.
Das ist zum Beispiel der Fall, wenn die Klasse irgendwelche C-Style-Arrays oder selbstgebastelte Pointer-Gebilde enthält, um die kümmern sich die Default-Methoden nämlich nicht. Das ist ein ganz wichtiger Grund, weshalb man sich in C++ so weit wie möglich von Oldschool-C-Datenstrukturen verabschieden sollte: Sie machen mörderisch viel Arbeit, |