0

我慢してください、私はC ++に比較的慣れていません。

これが私のプロジェクトです。私は基本的にチェスの簡単なゲームを作りたいと思っています。

私は最終的に抽象クラスになると考えている基本クラスのgamePieceを持っています(しかし、今はそうではありません)

基本クラスの gamePiece には、colorOfPiece、rankOfPiece、fileOfPiece などのデータ メンバーが多数あります。また、関数 void displayPieceInfo() もあり、cout を介してコンソールにこれらすべての値を単純に表示します。

このクラスからいくつかの派生クラスを作成する予定です。現在、「ルーク」サブクラスがあります。

1 つのベクターにさまざまなタイプのピースを追加したいので、後でイテレーターでトラバースできます。

これが私が遭遇している問題です。

vector<gamePiece> vectorOfAllGamePieces;
vector<gamePiece>::iterator itGamePieces; 

Rook を最初の要素としてベクターに push_back します。すべてのコンストラクターは正常に動作しているように見え、変数を初期化しています。しかし、最初の要素で表示機能を実行しようとすると、文字列が空/初期化されます。

itGamePieces=vectorOfAllGamePieces.begin();
itGamePieces->displayPieceInfo();

代わりに汎用の gamePiece をベクターにプッシュすると、すべてが適切に表示されます。

このようなベクトルを混合タイプのオブジェクトで使用することさえ許されますか? たとえば、派生クラスのオブジェクト、親クラスのオブジェクト、同じ親から派生した 2 番目のクラスのオブジェクトなどです。

もしそうなら、コンストラクターでデータ メンバーを設定した後でも、データ メンバーの値が正しく表示されないのはなぜだと思いますか?

4

2 に答える 2

3

スライスのため、そうではありません。派生オブジェクトを に追加すると、オブジェクトvector<gamePiece>がスライスされ、gamePieceオブジェクトが実際にベクターに追加されます。

(スマート) ポインターのベクトルを使用する必要があります。

于 2013-02-17T19:33:46.367 に答える
1

問題はこのようなものRook です GamePiece。ただし、Rook を GamePieces の場所に保管することはできません。aから a にのみキャストできます。したがって、ベクトルは保存する必要がありますが、 ( GamePiecesへのポインター)。Pointer to RookPointer to GamePiece GamePiecesGamePiece *

std::vector<GamePiece *> vectorOfAllGamePieces;

ただし、これによりメモリ管理に問題が生じる可能性があります。もう 1 つの方法は、Handlesポインターを使用せずに格納することです。(ハンドルは、ポインターへのポインターのようなものです)。またはもちろん、スマート ポインターを使用することもできます。

クイックハックは(これは一部の人々の目には「悪」である「ハック」です)、

std::vector<Rook> allRooks;
std::vector<Pawns> allPawns;
.....
std::vector<Queen> allQueens;
King theKing;

std::vector<GamePiece *> allPieces;

allPiecesには、他のベクトル内のオブジェクトへのポインターが含まれます。すべての種類の駒を正確に知っていれば、これで問題ないと思います (これはチェスだと思います)。

于 2013-02-17T19:46:53.177 に答える