C++ 迭代某个子类的列表
C++ Iterating over a list of a certain subclass
我有两个类。超类是"组件"类,子类是"转换"类。
我正在使用的框架有一个函数,该函数返回特定类型的组件列表。 但是,该列表将将它们作为组件返回,因为该类型不限于特定的子类(但这是我使用它的方式)。
因此,在以下场景中,我知道所有返回的组件都将属于 Transform 子类。我正在做的是迭代列表,然后将每个组件强制转换为转换。这是我的代码:
std::list<Cistron::Component*,std::allocator<Cistron::Component*>> playerTransforms = objectManager->getComponents(player,"Transform");
std::list<Cistron::Component*>::iterator playerComponentIterator = playerTransforms.begin();
for (playerComponentIterator; playerComponentIterator != playerTransforms.end(); playerComponentIterator++)
{
Transform *tmpTransform = static_cast<Transform*> (*playerComponentIterator);
std::cout << tmpTransform->x ;
std::cout << tmpTransform->y ;
}
效率如何?我对C++很陌生,所以我不知道是否有更好的方法。
这不是一个好的设计,在这种情况下,编译器应该生成警告。通常,您应该使用 dynamic_cast 向上投射指针。此强制转换具有一些运行时开销 - 与虚拟方法调用大致相同,但如果尝试强制转换不兼容的指针,它将生成异常。尝试重新设计应用以消除此代码。您应该只调用 Component
类的虚拟方法,而不应将指针强制转换为指向Component
指向Transform
的指针。这件事表明设计不好。
一种可能的设计是getComponents
模板方法来消除强制转换:
template<class T>
list<T*> getComponents(Player* player, std::string name) {
...
}
或者也许只是这个:
list<Transform*> getTransfromComponents(Player* player) {...}
在无法重构此代码的情况下,始终可以转换列表:
list<Component*> rlist = ...
list<Transform*> llist;
// Upcast all
transform(rlist.begin(),
rlist.end(),
back_inserter(llist),
[](Component* r) {
return dynamic_cast<Transform*>(r);
});
// Remove all null values
llist.remove(nullptr);
std::list
通常以双链表的形式实现,这意味着元素分散在内存中,这意味着遍历内存很慢。检查:为什么它在一个大的 std::list 上迭代如此缓慢?
但我更担心的是反射的使用:
objectManager->getComponents(player,"Transform");
这实际上可能是这段代码的真正瓶颈。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- C++将静态多态类自添加到子类的 constexpr 列表中
- 子类对象列表重新解释为基类对象列表?(C++11).
- SWIG C++ to Python:生成 Python 列表的子类
- C++:从两个包含子类 (typedef) 的列表创建一个列表
- 如何创建一个包含C 中的子类的类的链接列表
- 子类列表"master copies",寻找更好的设计
- 将子类列表转换为超类列表
- 从基类模板化列表中实例化子类对象
- C++传递包含子类元素的类列表
- 迭代子类列表错误
- 对 MFC 文档视图的列表视图进行子类化
- C++ 编译类的子类的时列表
- 如何调用父类类型列表的子类的方法?C++
- 为自定义对象列表使用哪个模型子类/视图
- 排序STL列表的子类
- 保留子类的中心列表,但避免静态实例
- C++不同子类的链接列表