簡體   English   中英

如何取消引用存儲在智能指針向量中的派生類對象?

[英]How to dereference derived class objects stored in a vector of smart pointers?

我正在建造一個國際象棋游戲。 我有一個基類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”(基礎)對象一起使用時,顯示功能會完美地顯示所有內容......因此必須有一個理由說明它與基類對象完美配合,而不是與派生對象配合使用。

是否有一些我缺少的步驟(比如我需要將“車”投入“gamePiece”才能將其放入矢量......)? 我還在另一篇文章中讀到某些類型的智能指針不能進入STL容器內部。 這是其中一個案例嗎? 或者它可能不會認識到車是游戲棋子的派生對象。 那節課在下面。

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) {}

..是從派生類調用父構造函數的正確方法。 你在內部做的不是初始化對象本身,而是直接調用構造函數。 我很驚訝您的編譯器可以讓您這樣做。 該車對象可能正在調用gamePiece的默認構造函數(我假設您在游戲類中定義了類似gamePiece() {}的東西)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM