C++ 如何取消对存储在智能指针向量中的派生类对象的引用?

C++ 如何取消对存储在智能指针向量中的派生类对象的引用?,c++,inheritance,vector,C++,Inheritance,Vector,我在下一盘棋。我有一个基类gamePiece和一个名为rook的派生类 我最初想把所有不同类型的片段放在一个向量中,并用迭代器遍历它。然而,我以前发现我不能在游戏片对象的向量中插入rook对象 许多人建议我使用指针来完成我所需要的——建议使用智能指针,特别是独特的和共享的指针。要查看我上一个问题中的讨论,请参阅以下链接: 建议的独特ptr的具体技术如下: vector<std::unique_ptr<gamePiece>> vectorOfPointersToGameP

我在下一盘棋。我有一个基类gamePiece和一个名为rook的派生类

我最初想把所有不同类型的片段放在一个向量中,并用迭代器遍历它。然而,我以前发现我不能在游戏片对象的向量中插入rook对象

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

建议的独特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));
vector<std::shared_ptr<gamePiece>> vectorOfPointersToGamePieces;
vectorOfPointersToGamePieces.push_back(std::make_shared<rook>(1, "Rook", 'A', 1, "White", "Up") );

。。是从派生类调用父构造函数的正确方法。您在内部所做的不是初始化对象本身,而是直接调用构造函数。我很惊讶你的编译器让你这么做。ROOK对象很可能调用GAMEPILE的默认构造函数(我假设您在GAMEPILE类中定义了类似代码< > GAMEPECE()){} /C++ > java。这不是C++中如何初始化基类的。是的,我是从java来C++的。谢谢——提供的答案让它工作了!!我以为我在初始化rook对象,结果我没有。正如许多人建议的那样,我必须在成员初始值设定者列表中初始化它。
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) {}