我想用C++编写一个国际象棋游戏。如何在引用基类对象的向量中引用派生对象?
我有一个基类gamePiece和派生类的白嘴鸦。我最初的想法是创建一个gamePiece对象的向量,并在其中插入所有不同类型的gamePieces(白嘴鸦,皇后,典当)。正如我在最后一个问题中发现的那样,我不能这么做 - gamePiece矢量只能使用基类(即gamePiece)对象。
但是,建议使用智能指针和其他技术。我会尽快尝试。
但我仍然好奇为什么下面的技术将无法正常工作。如果我改为创建一个指向gamePieces的指针向量,然后尝试将指向我的派生对象的指针存储在该向量内呢?
vector<gamePiece *> vectorOfPointersToGamePieces;
vector<gamePiece *>::iterator itOfPointersToGamePieces;
例如,假设我在 第一位置插入一个指向上述载体内的车对象。最初我认为可能的工作是这种策略:
vectorOfPointersToGamePieces.push_back(&(rook(1, "Rook", 'A', 1, "White", "Up") ));
itOfPointersToGamePieces=vectorOfPointersToGamePieces.begin();
(* (* (itOfPointersToGamePieces))).displayPieceInfo();
构造函数似乎运行良好,一切都初始化。但是,当用cout在屏幕上显示数据成员的值时,变量似乎是空的/单元化的。就像他们消失了一样。
我的第二个破解就是试图在插入向量之前动态地将白嘴鸦指针指向游戏手指指针,就像这样。
vectorOfPointersToGamePieces.push_back(dynamic_cast <gamePiece *> (&(rook(1, "Rook", 'A', 1, "White", "Up") )));
但是,这产生了与上述完全相同的输出。空/单元化变量。
在我第三次尝试时,我退后一步,尝试了一个更简单的操作。在这里,我试图在向量中插入一个指向gamePiece的指针,而不是指向一个白嘴鸦的指针。
vectorOfPointersToGamePieces.push_back(&(gamePiece(1, "Rook", 'A', 1, "White", "Up")));
有甚至第三operation--问题,只有一些我在构造函数初始化的时候我试图显示操作被保留的变量:
itOfPointersToGamePieces=vectorOfPointersToGamePieces.begin();
(* (* (itOfPointersToGamePieces))).displayPieceInfo();
更具体地说,整型,和字符被保留并正确显示。但弦乐空荡荡的,消失了。
任何人有任何想法,为什么我的策略不工作?