0

请耐心等待,我在 C++ 方面相对较新。

这是我的项目。我想从本质上创建一个简单的国际象棋游戏。

我有一个基类 gamePiece,我认为它最终会成为一个抽象类(但现在不是)

基类 gamePiece 中有一堆数据成员:colorOfPiece、rankOfPiece、fileOfPiece 等。它还有一个函数 void displayPieceInfo(),它通过 cout 在控制台上简单地显示所有这些值。

我计划从这个派生一些派生类。现在我有一个“车”子类。

我想在单个向量中添加各种类型的片段,以便稍后使用迭代器遍历它。

这是我遇到的问题。

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

我将 Rook 作为第一个元素推入向量中。所有的构造函数看起来都运行良好,正在初始化变量。然而,当我尝试在第一个元素上运行显示功能时,字符串为空/未初始化。

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

如果我将通用 gamePiece 推入向量中,一切都会正确显示。

我什至可以有一个这样的向量与混合类型的对象 - 例如,派生类的对象,父类的对象,从同一个父类派生的第二个类的对象

如果是这样,你为什么认为数据成员的值没有正确显示,即使我已经在构造函数中设置了它们?

4

2 回答 2

3

不是真的,因为切片。当您将派生对象添加到 avector<gamePiece>时,它会被切片,并且gamePiece对象实际上会添加到向量中。

您需要使用(智能)指针向量。

于 2013-02-17T19:33:46.367 回答
1

问题是这样的,Rook 是一个 GamePiece. 但是您不能将 Rook 存放在 GamePieces 的地方。您只能aPointer to Rook转换为 a Pointer to GamePiece。因此,您的向量必须保存NOT GamePieces而是GamePiece *(指向 GamePieces 的指针)。

std::vector<GamePiece *> vectorOfAllGamePieces;

但这可能会给您的内存管理带来麻烦。另一种方法是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 回答