gpt4 book ai didi

C++ 遍历某个子类的列表

转载 作者:行者123 更新时间:2023-11-28 00:39:07 24 4
gpt4 key购买 nike

我有两个类(class)。父类(super class)是“Component”类,子类是“Transform”类。

我使用的框架有一个返回特定类型组件列表的函数。但是,列表会将它们作为组件返回,因为类型不限于特定的子类(但这是我使用它的方式)。

因此,在下面的场景中,我知道所有返回的组件都属于 Transform 子类。我正在做的是遍历列表,然后将每个组件转换为 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);

关于C++ 遍历某个子类的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19753076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com