我正在尝试用 C++ 构建一个国际象棋游戏。
我有一个基类 gamePiece 和一个派生类 rook。我最初的想法是创建一个 gamePiece 对象 vector ,并在其中插入所有不同类型的 gamePieces(车、皇后、兵)。正如我在上一个问题中发现的那样,我不能这样做——gamePiece vector 只接受基类(即 gamePiece)对象。
但是,有人建议使用智能指针和其他技术。我会尽快尝试的。
但我仍然很好奇为什么下面的技术不起作用。如果我改为创建一个指向 gamePieces 的指针 vector ,然后尝试将指向我的派生对象的指针存储在该 vector 中,会怎样?
vector<gamePiece *> vectorOfPointersToGamePieces;
vector<gamePiece *>::iterator itOfPointersToGamePieces;
例如,假设我在上面的 vector 中插入了一个指向 rook 对象的指针 第一个位置。最初我认为可能有效的策略是:
vectorOfPointersToGamePieces.push_back( &(rook(1, "Rook", 'A', 1, "White", "Up") ) );
itOfPointersToGamePieces=vectorOfPointersToGamePieces.begin();
( * ( * (itOfPointersToGamePieces))).displayPieceInfo();
构造函数似乎运行良好,一切都已初始化。但是当需要使用 cout 在屏幕上显示数据成员的值时,变量似乎是空的/未初始化的。他们就像消失了一样。
我的第二个尝试是尝试将车指针动态转换为游戏指针,然后再将其插入 vector 中,就像这样。
vectorOfPointersToGamePieces.push_back( dynamic_cast <gamePiece *> (&(rook(1, "Rook", 'A', 1, "White", "Up") ) ) );
但这产生了与上面完全相同的输出。空/单元化变量。
第三次尝试时,我退后一步,尝试了一个更简单的操作。在这里,我尝试在 vector 中插入指向 gamePiece 的指针,而不是指向车的指针。
vectorOfPointersToGamePieces.push_back( &(gamePiece(1, "Rook", 'A', 1, "White", "Up")) );
甚至这第三个操作也有问题——当我尝试显示操作时,只保留了我在构造函数中初始化的一些变量:
itOfPointersToGamePieces=vectorOfPointersToGamePieces.begin();
( * ( * (itOfPointersToGamePieces))).displayPieceInfo();
更具体地说,整数和字符被保留并正确显示。但是字符串是空的并且消失了。
有人知道为什么我的策略不起作用吗?
最佳答案
你的问题是你正在获取一个临时对象的地址并将其存储在你的 std::vector
中,然后该对象被销毁,您将指向一个无效对象。
rook(1, "Rook", 'A', 1, "White", "Up")
构造一个临时的 rook
对象,你用 &
取地址和 push_back
它变成vectorOfPointersToGamePieces
.那个临时rook
在行尾和 vectorOfPointersToGamePieces
中的指针消失了悬而未决。使用该指针做几乎任何事情都会导致未定义的行为。
您可能需要动态分配您的 rook
像这样的对象:
vectorOfPointersToGamePieces.push_back(new rook(1, "Rook", 'A', 1, "White", "Up"));
但是,您需要确保自己 delete
当你完成它时。这就是为什么人们告诉你使用 std::shared_ptr
(或 std::unique_ptr
)。如果你有一个 std::vector<std::shared_ptr<gamePiece>>
那么你可以执行上面的行,而不必担心 delete
正在处理对象。
顺便说一句,命名一个std::vector<gamePiece*>
作为vectorOfPointersToGamePieces
看起来有点傻,不是吗?变量的名称应该描述它在抽象问题级别的含义,而不是其基础类型。你最好叫它gamePieces
.
关于c++ - 如何在指向基类对象的指针 vector 中引用派生对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14945787/