0

チェスゲームを作っています。基本クラスの gamePiece と rook という派生クラスがあります。

私はもともと、さまざまな種類のピースをすべて 1 つのベクター内に配置し、イテレーターでトラバースしたいと考えていました。ただし、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」(ベース) オブジェクトで使用すると、display 関数はすべてを完全に表示します...したがって、これがベース クラス オブジェクトでは完全に機能するのに、派生オブジェクトでは機能しないのには理由があるはずです。

私が見逃している何らかのステップはありますか (ベクトルに入れる前に「ルーク」を「gamePiece」にキャストする必要があります...)? また、特定のタイプのスマート ポインターは STL コンテナー内に移動できないという別の投稿をどこかで読みました。これはそれらのケースの1つですか?あるいは、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() {}ゲームピース クラスで定義されているようなものがあると思います)。

于 2013-02-20T04:52:19.267 に答える