【问题标题】:Appending "pointer to a child class" into a vector of "pointer to the parent class"将“指向子类的指针”附加到“指向父类的指针”的向量中
【发布时间】:2015-05-03 22:27:53
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 应该不需要强制转换 - 派生类指针可以隐式转换为基类指针,您使用 insert 应该可以正常工作。假设向量如您所描述的那样。也许您可以发布他们的声明和错误消息。
  • Works 我。
  • 这是目前的错误,我省略了其余的,因为它们都具有相似的效果。 Error 1 error C2440: 'initializing' : cannot convert from 'c_Gate' to 'c_Object *' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 600
  • 您正在尝试将c_Gate 的实例转换为父指针。
  • 这就是我真正想要实现的目标,因此是关于如何优雅高效地静态转换 c_Gate 的问题,最好不要在其父指针中使用循环。

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


【解决方案1】:

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

但是,除非您做的不是您所描述的,否则您不需要任何类型的显式转换,并且您发布的代码应该可以正常工作。

【讨论】:

  • for-range 循环似乎是 goto 方式,但是这不起作用的可能原因是什么:gate myGate; gameObj *mInstance = &amp;myGate; 似乎我的编译器不喜欢强制转换我的子类进入父类。我是否缺少允许隐式转换的特定运算符重载?
  • @ChristopherLeong:这也是works for me。你得到什么错误信息?您确定您的类型确实(公开)源自gameObj?
  • 好的,看来我找到了问题,我的子指针向量实际上是子对象的向量,因此我收到了这个错误:Error 1 error C2440: 'initializing' : cannot convert from 'c_Gate' to 'c_Object *' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 600
【解决方案2】:

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

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

感谢大家的帮助。

">_

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多