将“指向子类的指针”附加到“指向父类的指针”的向量中

时间:2015-03-03 10:05:40

标签: c++ vector polymorphism abstraction static-cast

使用" std :: vector :: 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向量。然而,这似乎相当笨拙和笨重,因为我会做出不必要的循环。

提前致谢。

2 个答案:

答案 0 :(得分:0)

test case值得千言万语。将您的描述翻译成可编辑的代码:

#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());
}

这个works for me,因为从派生类指针到基类指针的转换可以隐式完成。

如果您确实需要静态转换或其他转换,那么您可以避免使用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));
}

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

答案 1 :(得分:0)

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

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

谢谢大家的帮助。

&#34;&GT; _&LT;&#34;