将"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"
我在使用"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));
}
但是,除非你在做你所描述的以外的事情,否则你不需要任何形式的显式转换,你发布的代码应该可以工作。
所以这对我来说是一个巨大的错误,我认为子游戏对象存储了一个指针向量,并将其视为转换错误的原因。
将我的向量从对象更改为指向对象的指针向量就是解决方案。
感谢大家的帮助。
">_<"
相关文章:
- Json Serialize Vector to json<Class> array (nlohmann/json.hpp)
- Python class inheritance to c++
- 列表插入"Cannot convert argument from Class<T>* to Class<T> &&"
- 当从此到子类中的新对象时,将显示警告"destination for this 'memcpy' call is a pointer to dynamic class..."
- C++:除虚函数外," undefined reference to 'typeinfo for [class name]' "的原因是什么
- 将"pointer to a child class"追加到"pointer to the parent class"向量中
- C++常见问题 32.8 "pass an object of a C++ class to/from a C function"问题
- 多态性>错误:'no known conversion from derived class to base class'
- Clang - 删除某些文件的"conversion function converting <A> to base class <B> will never be used"
- C++ "Could not convert 'class instance' from 'Class (*)()' to 'Class'"
- 无法将"member pointer to derived class"转换为"member pointer to base class"
- C++ "undefined reference to class::function"
- 简洁的"this class overrides all necessary methods to be non-abstract"
- 这个错误是什么意思" expression must have pointer-to-class type"?
- 使用C++中的String To Class Lookup表来实例化类
- Eclipse ADT "undefined reference to (custom class)",但在 Xcode 中工作正常(使用 Cocos2dx)
- (SWIG c++ to Python)警告301:使用了class关键字,但不在c++模式下
- 使用 -> 时提供对象"must be a pointer-to-class type",使用 - 时提供"must be a class type"对象
- 在我的C++游戏中出现"undefined reference to class::function"错误。
- 通过"pointers to class members"访问数组类成员