使用" 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
向量。然而,这似乎相当笨拙和笨重,因为我会做出不必要的循环。
提前致谢。
答案 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;