0

我正在构建一个国际象棋游戏。我有一个基类 gamePiece 和一个名为 rook 的派生类。

我最初想将所有不同类型的片段放在一个向量中,并用迭代器遍历它。但是,我之前发现我无法在 gamePiece 对象的向量中插入 rook 对象。

许多人建议我改用指针来完成我需要的工作——建议使用智能指针,特别是 unique_ptr 和 shared_ptr。要查看我上一个问题中的讨论,请参阅以下链接:

如何在指向基类对象的指针向量中引用派生对象?

为 unique_ptr 建议的具体技术在这里:

vector<std::unique_ptr<gamePiece>> vectorOfPointersToGamePieces;
std::unique_ptr<gamePiece> rk( new rook(1, "Rook", 'A', 1, "White", "Up") );
vectorOfPointersToGamePieces.push_back(std::move(rk));

shared_ptr 的具体技术在这里:

vector<std::shared_ptr<gamePiece>> vectorOfPointersToGamePieces;
vectorOfPointersToGamePieces.push_back(std::make_shared<rook>(1, "Rook", 'A', 1, "White", "Up") );

但是,这些技术似乎都不适合我。实际上,我应该再澄清一点——它部分有效。当与“rook”(派生)对象一起使用时,显示函数报告我的字符串是空的并且变量看起来是未初始化的,即使构造函数中的所有内容似乎都工作正常。

然而,当这些技术与“gamePiece”(基础)对象一起使用时,显示功能完美地显示了所有内容......因此,必须有一个原因为什么它可以完美地与基类对象一起使用,但不能与派生对象一起使用。

我是否缺少某种步骤(例如,在将“车”放入矢量之前,我是否需要将“车”放入“游戏块”中……)?我还在某处的另一篇文章中读到某些类型的智能指针不能进入 STL 容器。这是其中一种情况吗?或者它可能没有认识到 rook 是 gamePiece 的派生对象。那堂课在下面。

class rook: public gamePiece
{

public:
rook(int player, string type, char file, int rank, string color, string facing)
{
    gamePiece(player, type, file, rank, color, facing);
}

};
4

1 回答 1

2
rook(int player, string type, char file, int rank, string color, string facing)
 : gamePiece(player, type, file, rank, color, facing) {}

.. 是从派生类调用父构造函数的正确方法。您在内部所做的不是初始化对象本身,而是直接调用构造函数。我很惊讶您的编译器允许您这样做。rook 对象可能会调用 gamePiece 的默认构造函数(我假设您gamePiece() {}在 gamepiece 类中定义了类似的东西)。

于 2013-02-20T04:52:19.267 回答