c++ - 如何在指向基类对象的指针 vector 中引用派生对象?

标签 c++ inheritance vector

我正在尝试用 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/

相关文章:

css - 防止<img>标签继承未知来源的css样式

c++ - 释放存储在 vector 中的对象?

在 r 中重复一些元素

c++ - 如何在参数和返回类型上使用匹配的 const 修饰符编写函数?

c++ - 如何在 C++ 中为变量创建全局常量别名

C++ : Find the closest values in an array

C++ 比较指向不同类型的指针?

c++ - 无法在 C++ 中初始化方法指针映射

function - Lua与继承: unable to access self object in functions

java - 继承和动态绑定(bind)