我有一个基对象和派生类对象的向量,但我无法访问存储在向量中的派生对象继承的数据成员
I have a vector of Base and Derived Class Objects, but I can't access data members inherited by derived objects that are stored in the vector
请耐心听我说,我对C++还比较陌生。
这是我的项目。我想创造一个简单的国际象棋游戏。
我有一个基类gamePiece,我想它最终会变成一个抽象类(但现在不是)
基类gamePiece中有一组数据成员:colorOfPiece、rankOfPiece、fileOfPiece等。它还有一个函数void displayPieceInfo(),它只是通过cout在控制台上显示所有这些值。
我正在计划从这个派生出一些类。现在我有一个"rook"子类。
我想在一个向量中添加各种类型的片段,这样我以后就可以用迭代器遍历它了。
这就是我遇到的问题。
vector<gamePiece> vectorOfAllGamePieces;
vector<gamePiece>::iterator itGamePieces;
我将Rook作为第一个元素推回到向量中。所有构造函数看起来都运行良好,正在初始化变量。然而,当我尝试在第一个元素上运行display函数时,字符串是空的/统一的。
itGamePieces=vectorOfAllGamePieces.begin();
itGamePieces->displayPieceInfo();
如果我把一个通用的gamePiece推到向量中,一切都会正常显示。
我甚至可以有一个这样的向量,其中包含混合类型的对象吗?例如,派生类的对象、父类的对象,从同一父派生的第二类的对象
如果是这样的话,为什么你认为数据成员的值没有正确显示,即使我在构造函数中设置了它们?
不是真的,因为切片。将派生对象添加到vector<gamePiece>
时,会对其进行切片,并将gamePiece
对象实际添加到向量中。
您需要使用(智能)指针的矢量。
问题是这样的,Rook
是一个GamePiece
。但是你不能把一只公鸡放在一个放GamePieces的地方。只能将Pointer to Rook
强制转换为Pointer to GamePiece
。因此,您的矢量必须保存而不是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
将包含指向其他向量中的对象的指针。当你完全知道所有棋子的类型时,我认为这是可以的(我想这是国际象棋)。
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 从多个源构造一个对象,包括一个对象向量
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 对象 C++ 向量的 STL 容器
- 初始化C++中的对象向量
- 从自定义类获取对象向量中的 max 元素
- 如何在 c++ 中打印存档中的对象向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 尝试重载输出运算符时,我无法遍历对象向量
- 如何在C++中打印对象向量的内容
- 打印出对象向量中的每个元素C++
- 在 c++ 的构造函数中分配对象向量时出错
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 对象向量是否在堆或堆栈上分配C++?
- 基于不同字段的对象向量的排序功能
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 用rapidjson读取子对象向量
- 尝试使用比较运算符对对象向量进行排序
- 如何用对象向量重载 cin(>>)
- 如何将某个元素从shared_ptr擦除到对象向量?