C++:不确定类 - 类管理器关系

标签 c++ oop design-patterns

在我的项目中,我有一系列类,出于特定原因,它们的实例由某个管理器类管理。

例子是:

CSound - Abstracts a single sound

CSoundManager - Friend of CSound, provides factory methods for creating CSound instances, mixes active sounds together

还有:CFont、CFontManager(用于按名称访问字体)、CSprite、CSpriteManager(用于绘制每一帧),等等。

这里是我的第一个问题:

  • 我正在做的是一个特定的命名设计模式吗?
  • 在大多数情况下,无论出于何种原因,这都是一个坏主意吗?如果是,为什么?

然后,我问自己:

  • 应该如何创建和销毁对象?我应该允许在堆栈上或直接使用 new 创建它们,还是只允许通过相应管理器类的方法创建它们?

(也用于销毁:delete myFont;FontManager.DestroyFont( myFont );)

最佳答案

听起来你可能违反了 The Single Responsibility Principle (SRP)原则。

CSoundManager 类是负责创建和管理CSound 对象的生命周期,还是负责将事件声音混合在一起?名字可以告诉你很多,而“经理”可以有太多的理解......

通常,如果您希望这些 Manager 类处理对象的生命周期,那么它们很可能是实例化这些对象(即对象中的私有(private) ctors)的唯一方法。查看Factory Design Pattern ,尽管您的实现有点不同。

如果您这样做,则客户端代码应该永远不会调用newdelete。手动调用 delete 容易出错,应避免使用 RAII 等惯用语。 .在这种特殊情况下,Manager 类应该管理对象的生命周期,因此 delete 永远不会出现在客户端代码中。

关于C++:不确定类 - 类管理器关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5236452/

相关文章:

c++ - 中缀对话的后缀

java - 帮助正确设计通用套接字服务器

oop - 对 Matlab 中的类 get 函数返回的数据数组进行寻址

c# - 在 "public T SomeMethod<T>(string item) where T : new();"中有 new() 的用例是什么

PHP:是否有一种设计模式可以将对象保存在数据库中?

c++ - 如何使用 C++ 以跨平台方式检查操作系统版本?

c++ - c++中的编译错误是什么?

c++ - 应用基于不同掩码的位掩码

java - 对于这种不明确定义的继承,正确的设计模式是什么?

c# - 强制程序员调用其 Base 中的方法