gpt4 book ai didi

c++ - 如何取消引用存储在智能指针 vector 中的派生类对象?

转载 作者:行者123 更新时间:2023-11-28 03:22:53 25 4
gpt4 key购买 nike

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

我本来想把所有不同类型的片段放在一个 vector 中,然后用迭代器遍历它。但是,我之前发现我无法在 gamePiece 对象的 vector 中插入 rook 对象。

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

How to reference derived objects in a vector of pointers to base class objects?

此处为 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”(基础)对象一起使用时,显示功能会完美地显示所有内容......因此必须有一个原因可以完美地处理基类对象,但不能处理派生对象。

我是否遗漏了某种步骤(比如我是否需要在将“车”放入“gamePiece”之前将其放入 vector 中...)?我还在某处的另一篇文章中读到,某些类型的智能指针不能进入 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);
}

};

最佳答案

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

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

关于c++ - 如何取消引用存储在智能指针 vector 中的派生类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14972373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com