Ale*_*ani 1 c++ rendering pointers
我有这个库,其中有一个不同类型元素的通用显示列表,对于系统的每个循环,通过在添加到列表的每个对象上调用render()方法来呈现此显示列表.现在,列表可以包含不同类的元素,比如说A,B,C,D都有它们特有的void render();
我已经找到了两种工作方式,并希望了解哪种方法在速度方面应该更好(或者如果有更好的方法与我正在评估的方法不同请建议它).
选项1:最简单的方法,我在每个A,B,C..etc类的公共超类上都有一个int类型变量,它标识该类的编号.因此,当显示列表呈现时,有一个大的switch(){}询问类型,并根据此变量的值,对相应的类进行转换以呈现它,如下所示:
case OBJ_A:
((ObjA*)obj)->render();
break;
Run Code Online (Sandbox Code Playgroud)
这是因为所有对象都作为指向超类类型的指针添加到列表中.
选项2:使用函数指针.(如http://www.newty.de/fpt/functor.html中所述).这里我们有一个模板仿函数类,它可以作为参数接收任何其他类,并存储对render函数的指针引用.因此,当循环遍历它时,仿函数类将进行转换...我不知道它在运行时的含义.
感谢您的帮助!
为什么不使用虚拟功能?
class Renderable {
public:
virtual void Render() = 0;
};
class ARenderable : public Renderable {
public:
virtual void Render() {
// implement this
}
}
class BRenderable : public Renderable {
public:
virtual void Render() {
// implement this
}
}
// .. and then keep a list of Renderable's and call Render() on all of them
std::vector<Renderable*> rr;
rr.push_back(new ARenderable());
rr.push_back(new BRenderable());
// (pseudocode)
for each .. Renderable * r
r->Render()
Run Code Online (Sandbox Code Playgroud)
这三种情况下的运行时开销是相似的 - 基本上,虚函数是函数指针,只是非常优雅的函数;-)使用这种策略来解决这些问题在C++中是惯用的,在面向对象编程中是基本的.