将"pointer to a child class"追加到"pointer to the parent class"向量中

Appending "pointer to a child class" into a vector of "pointer to the parent class"

本文关键字:to class pointer parent 向量 the 追加 child      更新时间:2023-10-16

我在使用"std::vector::insert"的insert函数将子类静态转换为父类时遇到了一些困难

这里有一些代码来理解我要做的事情:

  mInstancedObjects.insert(mInstancedObjects.end(), mGates.begin(), mGates.end());
  mInstancedObjects.insert(mInstancedObjects.end(), mProjectiles.begin(), mProjectiles.end());
  mInstancedObjects.insert(mInstancedObjects.end(), mSwitches.begin(), mSwitches.end());
  mInstancedObjects.insert(mInstancedObjects.end(), mPitfalls.begin(), mPitfalls.end());

在这种情况下,向量mInstancedObjects是指向名为gameObj的抽象类的指针的向量。

函数的第二个和第三个参数是指向子类的指针向量,该子类也继承自gameObj

为了我一生的挚爱,我无法找到将静态指针插入矢量mInstancedObjects 的正确方法

这是正确的做法吗?

我的猜测是,我必须遍历每个元素,并手动静态强制转换obj,然后将obj推回到mInstancedObjects向量中。然而,这似乎相当笨拙,因为我会制造不必要的循环。

提前谢谢。

一个测试用例胜过千言万语。将您的描述翻译成可编译代码:

#include <vector>
struct gameObj {};
struct gate : gameObj {};
int main() {
    std::vector<gameObj*> mInstancedObjects;
    std::vector<gate*> mGates;
    mInstancedObjects.insert(mInstancedObjects.end(), mGates.begin(), mGates.end());
}

这对我来说很有效,因为从派生类指针到基类指针的转换可以隐式完成。

如果您确实需要静态强制转换或其他转换,则可以避免使用std::transform 的循环

std::transform(mGates.begin(), mGates.end(),
               std::back_inserter(mInstancedObjects),
               [](gate * p) {return static_cast<gameObj*>(p);});

尽管一种新型的for循环实际上可能更好:

for (auto p : mGates) {
    mInstancedObjects.push_back(static_cast<gameObj*>(p));
}

但是,除非你在做你所描述的以外的事情,否则你不需要任何形式的显式转换,你发布的代码应该可以工作。

所以这对我来说是一个巨大的错误,我认为子游戏对象存储了一个指针向量,并将其视为转换错误的原因。

将我的向量从对象更改为指向对象的指针向量就是解决方案。

感谢大家的帮助。

">_<"

相关文章: