代码之家  ›  专栏  ›  技术社区  ›  Yippie-Ki-Yay

C++设计问题

  •  0
  • Yippie-Ki-Yay  · 技术社区  · 15 年前

    我正在研究游戏引擎原型,有以下问题:

    现在,我的引擎实现是DirectX绑定的,并且一切正常。

    我有一个 core::Renderer 类的方法 渲染几何体、设置明暗器、闪电等…

    有些是模板化的,有些不是。

    class Renderer {
    
       // ...
       template <typename Geometry> RenderGeometry(shared_ptr<Geometry> geometry);
    };
    

    假设我想扩展我的引擎的灵活性,我不想使用DirectX和OpenGL。正如我现在所理解的,其思想是将所有特定于基础的接口 核心:渲染器 上课,打所有的电话 virtual 然后提供 特定于DirectX OpenGL专用 实施。

    如果我的几何对象不是模板,一切都会看起来更好:

    class Renderer {
    
       virtual void RenderGeometry(shared_ptr<core::Non_template_Geometry> geometry);
    
    };
    
    class DXRenderer {
    
       // Here goes our custom implementation
       // for DirectX-based geometry rendering
       virtual void RenderGeometry(...)
    };
    
    // The same for OpenGL
    

    第一个(初始变量)的问题是不允许对虚拟函数进行模板化。

    所以问题来了——我该如何解决?

    针对这种情况或 模板虚拟函数 仿真?

    2 回复  |  直到 15 年前
        1
  •  2
  •   James McNellis    15 年前

    使用底座 Geometry 班级:

    class Geometry {
    public:
        virtual ~Geometry() { }
        virtual void Render() = 0;
    };
    

    并让每个几何体类型类都从此基类派生,并通过重写实现其特定的呈现功能 Render .

    然后, Renderer::RenderGeometry 不需要是函数模板;它只需要一个指向基的指针 几何学 类并调用虚函数 伦德尔 .

        2
  •  1
  •   kizzx2    15 年前

    模板不是必需的。如果仔细考虑,大多数时候模板只做文本替换,是一个更安全的宏。

    OOP的设计并不是很大程度上依赖于模板,而是组合和继承(就像詹姆斯建议的那样)。