C++ 我应该为需要在堆上分配的多态类制作包装器吗?

C++ 我应该为需要在堆上分配的多态类制作包装器吗?,c++,C++,现在,我正在开发的游戏GUI API有一个抽象的图像和字体类。根据他们是否使用GL、SDL等字体,他们加载如下字体: Font *segoe = Font::load("segoe.ttf"); 还有一个对应的destroy()静态函数 我喜欢这个设计,但我想知道是否将它包装成不需要指针的好主意。类似这样的内容(具有更好的命名约定) 它还将具有重载=和一个复制构造函数以及一个析构函数 一般来说,用户更需要游戏gui来管理他们的图像和字体,还是更需要包装模式 感谢基本上,这是一种用于处理加载/销

现在,我正在开发的游戏GUI API有一个抽象的图像和字体类。根据他们是否使用GL、SDL等字体,他们加载如下字体:

Font *segoe = Font::load("segoe.ttf");
还有一个对应的destroy()静态函数

我喜欢这个设计,但我想知道是否将它包装成不需要指针的好主意。类似这样的内容(具有更好的命名约定)

它还将具有重载=和一个复制构造函数以及一个析构函数

一般来说,用户更需要游戏gui来管理他们的图像和字体,还是更需要包装模式


感谢

基本上,这是一种用于处理加载/销毁逻辑的自定义智能指针类型。这是非常地道的,也是C++的方法。资源管理应该是自动化的


所以你的包装很好,但也许你是在重新发明轮子。您可以考虑改写字体系统,即“代码>销毁< /代码>的工作被移到<代码>字体<代码>析构函数,在这种情况下,您可以使用常规 Booo::SyrdYPPTR <代码>(也可以从代码< > STD <代码> > C++ 0x中分别<代码> STD::Tr1在支持技术报告1的旧编译器中)。对于当前代码,您也可以使用
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;
}