Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:不确定班级与班级经理的关系_C++_Oop_Design Patterns - Fatal编程技术网

C++ C++;:不确定班级与班级经理的关系

C++ C++;:不确定班级与班级经理的关系,c++,oop,design-patterns,C++,Oop,Design Patterns,在我的项目中,我有一系列的类,由于特定的原因,它们的实例由某个管理器类管理 例如: CSound-提取单个声音 CSound经理-CSound的朋友, 提供用于创建的工厂方法 CSound实例,混合活动声音 一起 另外还有:CFont、CFontManager(用于每个名称的字体访问)、CSprite、CSpriteManager(用于绘制每个帧)等等 以下是我的第一个问题: 我正在做的是一个特定的命名设计模式吗 在大多数情况下,无论出于何种原因,这是一个坏主意吗?若有,原因为何 然后,我问

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

例如:

CSound-提取单个声音

CSound经理-CSound的朋友, 提供用于创建的工厂方法 CSound实例,混合活动声音 一起

另外还有:CFont、CFontManager(用于每个名称的字体访问)、CSprite、CSpriteManager(用于绘制每个帧)等等

以下是我的第一个问题:

  • 我正在做的是一个特定的命名设计模式吗
  • 在大多数情况下,无论出于何种原因,这是一个坏主意吗?若有,原因为何
然后,我问自己:

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

(也用于销毁:
删除myFont;
与。
FontManager.DestroyFont(myFont);

看起来您正在使用某种形式的工厂设计模式。不知道是什么让你觉得这是个坏主意


如果您将管理器视为对象的容器,那么它将控制这些对象的生命周期。但是,如果您的对象需要超出Manager的生命周期,则您可以使用new创建它们,Manager可能不会对销毁负责。

听起来您可能违反了此原则

CSoundManager
类是负责创建和管理
CSound
对象的生存期,还是负责将活动声音混合在一起?名字可以告诉你很多,而“经理”可以用太多的方式来理解

通常,如果您希望这些管理器类处理对象的生命周期,那么它们很可能是实例化这些对象(即对象中的私有构造函数)的唯一方法。请参阅,尽管您的实现有点不同


如果执行此操作,则客户端代码不应调用
new
delete
。手动调用
delete
容易出现错误,应该避免使用诸如。在这种特殊情况下,Manager类应该管理对象的生存期,因此,
delete
永远不会出现在客户机代码中。

通常,您要实现的是一个工厂方法模式,其中一个对象分配另一个对象。但是,您并没有从工厂类中获益,因为您直接将分配的类型绑定到工厂,而不是允许工厂抽象地管理所有内部。例如,您可以从任何文件或该资源类型的工厂(CSoundManager)执行此操作:new CSound()

如果是这样的话,你就没有抓住要点,你基本上只有一个分配和管理对象的单例。考虑抽象资源类型。如果CSound和CFont是从IResource派生的,那么您可以有一个CResourceManager,它只为该类型获取一个枚举或某种标识符,并减少代码库中的耦合和依赖性。无论何时需要使用该对象,您都可以公开该类型,但更可能的是,您可以使用抽象管理器(CResourceManager)使用公共接口(Update()、Create()、Destroy()等)来处理这些对象

对于sound manager,请记住声音只需加载一次,并且可以使用唯一状态实例化。在该权限下,让资源管理器管理实际资源(CSound),声音管理器(CSoundManager)维护离散实例(例如CSoundInstance)并管理混音(通过CSoundMixer)。以有意义的方式专门化类,以管理复杂性并减少冗余


我以声音管理器为例,但这适用于大多数io系统(图形、输入、物理)。

不要在类名开头加“C”。一个更好的问题是“为什么所有东西都是从C开始的?”很多项目都是这样做的,而不是名称空间。我能想到的最大的例子是虚幻引擎,它(几乎)在所有东西前面加上“Un”。然而,这确实使大声朗读某些类名产生了不幸的后果。
微软对他们的MFC类也是如此。例如,它们还有一个CFont类。这是在自己的类中不使用C的一个很好的理由!