【发布时间】:2010-04-21 20:45:36
【问题描述】:
嗨!
我正在尝试在 C++ 编码模式中找到一些最佳解决方案,这是我的 游戏引擎 相关问题之一。
看一下游戏对象声明(我删除了几乎所有与问题无关的内容)。
// Abstract representation of a game object
class Object :
public Entity,
IRenderable, ISerializable {
// Object parameters
// Other not really important stuff
public:
// @note Rendering template will never change while
// the object 'lives'
Object(RenderTemplate& render_template, /* params */) : /*...*/ { }
private:
// Object rendering template
RenderTemplate render_template;
public:
/**
* Default object render method
* Draws rendering template data at (X, Y) with (Width, Height) dimensions
*
* @note If no appropriate rendering method overload is specified
* for any derived class, this method is called
*
* @param Backend & b
* @return void
* @see
*/
virtual void Render(Backend& backend) const {
// Render sprite from object's
// rendering template structure
backend.RenderFromTemplate(
render_template,
x, y, width, height
);
}
};
这也是 IRenderable 接口声明:
// Objects that can be rendered
interface IRenderable {
/**
* Abstract method to render current object
*
* @param Backend & b
* @return void
* @see
*/
virtual void Render(Backend& b) const = 0;
}
以及源自Object 的真实对象样本(经过严格简化:)
// Ball object
class Ball : public Object {
// Ball params
public:
virtual void Render(Backend& b) const {
b.RenderEllipse(/*params*/);
}
};
我想要的是拥有某种标准函数的能力,如果没有适当的重载,它将为对象绘制精灵(这是Object::Render)。
因此,可以在没有Render(...) 方法的情况下拥有对象,如果您尝试渲染它们,则会调用此默认的精灵渲染内容。而且,可以有专门的对象,定义自己的渲染方式。
我觉得,这种做事方式还是挺不错的,但是我想不通——
有什么方法可以将对象的“正常”方法(如Resize(...) 或Rotate(...))实现与其渲染实现分开?
因为如果一切都按照前面描述的方式完成,实现任何类型对象的通用 .cpp 文件通常会混合 Resize(...) 等方法实现和 virtual Render(...) 方法,这似乎是一团糟。我实际上想在一个地方为对象提供渲染过程,并在另一个地方提供它们的“逻辑实现”。
有没有办法可以做到这一点(可能是替代模式或技巧或提示)或者这是所有这些 多态 和 虚拟 东西在代码放置方面很糟糕的地方?
【问题讨论】:
-
这并不能回答您的问题,但您的 IRenderable 代码中的虚拟析构函数在哪里?没有它,您将泄漏大量内存。
-
当我在实际代码中通过
new分配内存时,我会添加它。我现在正在做的事情(仅用于测试和原型制作)通常就像创建Ball ball并调用ball.Render(backend);。我知道在这种情况下,我什至不需要virtual的东西,但我想我很快就会制作类似std::vector<IRenderable*>的东西,然后我实际上需要一个虚拟析构函数。无论如何,谢谢你的指点:) -
最好一开始就做,然后结束;为什么要冒着以后忘记的风险?它只有一行代码。
标签: c++ polymorphism virtual design-patterns