C++ 我应该为需要在堆上分配的多态类制作包装器吗?
现在,我正在开发的游戏GUI API有一个抽象的图像和字体类。根据他们是否使用GL、SDL等字体,他们加载如下字体:C++ 我应该为需要在堆上分配的多态类制作包装器吗?,c++,C++,现在,我正在开发的游戏GUI API有一个抽象的图像和字体类。根据他们是否使用GL、SDL等字体,他们加载如下字体: Font *segoe = Font::load("segoe.ttf"); 还有一个对应的destroy()静态函数 我喜欢这个设计,但我想知道是否将它包装成不需要指针的好主意。类似这样的内容(具有更好的命名约定) 它还将具有重载=和一个复制构造函数以及一个析构函数 一般来说,用户更需要游戏gui来管理他们的图像和字体,还是更需要包装模式 感谢基本上,这是一种用于处理加载/销
Font *segoe = Font::load("segoe.ttf");
还有一个对应的destroy()静态函数
我喜欢这个设计,但我想知道是否将它包装成不需要指针的好主意。类似这样的内容(具有更好的命名约定)
它还将具有重载=和一个复制构造函数以及一个析构函数
一般来说,用户更需要游戏gui来管理他们的图像和字体,还是更需要包装模式
感谢基本上,这是一种用于处理加载/销毁逻辑的自定义智能指针类型。这是非常地道的,也是C++的方法。资源管理应该是自动化的
所以你的包装很好,但也许你是在重新发明轮子。您可以考虑改写字体系统,即“代码>销毁< /代码>的工作被移到<代码>字体<代码>析构函数,在这种情况下,您可以使用常规
shared\u ptr
,但您需要提供一个定制的删除程序,我觉得这有点麻烦。基本上,这是一种定制的智能指针类型,用于处理加载/销毁逻辑。这是非常地道的,也是C++的方法。资源管理应该是自动化的
所以你的包装很好,但也许你是在重新发明轮子。您可以考虑改写字体系统,即“代码>销毁< /代码>的工作被移到<代码>字体<代码>析构函数,在这种情况下,您可以使用常规 Booo::SyrdYPPTR <代码>(也可以从代码< > STD <代码> > C++ 0x中分别<代码> STD::Tr1在支持技术报告1的旧编译器中)。对于您当前的代码,您也可以使用shared\u ptr
,但您需要提供一个自定义的删除程序,我觉得这有点麻烦。是的,这就是方法。小结:为什么不干脆
WrappedFont segoe=WrappedFont(“segoe.ttf”)
您不需要向用户公开每个细节。它越简单,错误就越少。如果他们真的需要了解所涉及的字体,请添加一个font getFont()方法。是的,就是这样。小结:为什么不干脆
WrappedFont segoe=WrappedFont(“segoe.ttf”)
您不需要向用户公开每个细节。它越简单,错误就越少。如果他们真的需要了解所涉及的字体,请添加font getFont()方法。这始终是个人的选择。如果您决定在构造函数/init方法中分配,并在析构函数中销毁,那么这是一个好主意(因为您还有shared\u ptr
)
但是请注意,如果它是多态的,那么类范围之外的虚拟调用将类似于
WrappedFont segoe = WrappedFont(Font::load("segoe.ttf"));
seogoe.getFontPtr()->VirtualFunction(); // more text !
这始终是个人的选择。如果您决定在构造函数/init方法中分配,并在析构函数中销毁,那么这是一个好主意(因为您也有shared_ptr
)
但是请注意,如果它是多态的,那么类范围之外的虚拟调用将类似于
WrappedFont segoe = WrappedFont(Font::load("segoe.ttf"));
seogoe.getFontPtr()->VirtualFunction(); // more text !
您可以这样做,但其目的是简化用户生活
我通常为此介绍两个类:
Font
:一个基本的非虚拟类,充当包装器和资源管理器,并将调用委托给实现(内部)
FontInterface
:纯界面
自定义是通过从FontInterface
派生,然后以某种方式连接到Font
。如果我完全控制代码,我通常会要求为每个派生类添加一个枚举成员,Font
的构造函数打开该enum
来实例化正确的派生类
这确实是策略
和工厂
模式的混合:
class Font
{
public:
enum Type { Segoe };
explicit Font(Type type);
void call1() const { _impl->call1(); }
void call2() const { _impl->call2(); }
private:
std::unique_ptr<FontInterface> _impl;
};
类字体
{
公众:
枚举类型{Segoe};
显式字体(类型);
void call1()常量{u impl->call1();}
void call2()常量{u impl->call2();}
私人:
std::唯一的\u ptr\u impl;
};
这里真正有趣的是,界面在重新设计时是稳定的(对于用户而言)。事实上,存在一个依赖于所选字体的内部实现是完全隐藏的
事实上,朝着FlyWeight
模式发展是很容易的,因为在字体的情况下Font
本身通常是无状态的,只需指定行为。只需将std::unique\u ptr
更改为std::shared\u ptr
,并使用一个简单的缓存系统在内存中维护当前加载的字体(使用弱\u ptr
)并在必要时将它们交给用户。您可以这样做,但其目的是简化用户生活
我通常为此介绍两个类:
Font
:一个基本的非虚拟类,充当包装器和资源管理器,并将调用委托给实现(内部)
FontInterface
:纯界面
自定义是通过从FontInterface
派生,然后以某种方式连接到Font
。如果我完全控制代码,我通常会要求为每个派生类添加一个枚举成员,Font
的构造函数打开该enum
来实例化正确的派生类
这确实是策略
和工厂
模式的混合:
class Font
{
public:
enum Type { Segoe };
explicit Font(Type type);
void call1() const { _impl->call1(); }
void call2() const { _impl->call2(); }
private:
std::unique_ptr<FontInterface> _impl;
};
类字体
{
公众:
枚举类型{Segoe};
显式字体(类型);
void call1()常量{u impl->call1();}
void call2()常量{u impl->call2();}
私人:
std::唯一的\u ptr\u impl;
}