忍受我,我在C ++方面相对较新。
这是我的项目。我想基本上创建一个简单的国际象棋游戏。
我有一个基类gamePiece,我认为它最终将成为一个抽象类(但现在它不是)
基类gamePiece里面有一堆数据成员:colorOfPiece,rankOfPiece,fileOfPiece等。它还有一个函数,void displayPieceInfo(),它只是通过cout在控制台上显示所有这些值。
我打算从这个中获得许多派生类。现在我有一个“车”子类。
我想在一个向量中添加各种类型的片段,所以稍后我可以用迭代器遍历它。
这是我遇到的问题。
vector<gamePiece> vectorOfAllGamePieces;
vector<gamePiece>::iterator itGamePieces;
我将一个Rook推入向量作为第一个元素。所有构造函数看起来都运行正常,初始化变量。然而,当我尝试在第一个元素上运行显示功能时,字符串是空的/单元化的。
itGamePieces=vectorOfAllGamePieces.begin();
itGamePieces->displayPieceInfo();
如果我将通用游戏内容推入向量中,一切都会正常显示。
我是否允许使用混合类型的对象来获得这样的矢量 - 例如,派生类的对象,父类的对象,从同一父类派生的第二类的对象
如果是这样,为什么你认为数据成员的值没有正确显示,即使我已经在构造函数中设置了它们?
答案 0 :(得分:3)
不是真的,因为切片。当您将派生对象添加到vector<gamePiece>
时,它会被切片并且gamePiece
对象实际上被添加到向量中。
你需要使用(智能)指针的矢量。
答案 1 :(得分:1)
问题是这样的,Rook
是 GamePiece
。但你不能在一个GamePieces的地方存放一辆车。您只能施放 Pointer to Rook
到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
将包含指向其他向量中对象的指针。
当你完全知道所有类型的棋子时,我觉得这很好(我猜这是国际象棋)。