Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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++_Design Patterns_Singleton - Fatal编程技术网

C++ 一个像单身汉一样的管理类,更好的设计?

C++ 一个像单身汉一样的管理类,更好的设计?,c++,design-patterns,singleton,C++,Design Patterns,Singleton,我正在制作一个游戏引擎,我正在使用库来完成各种任务。例如,我使用需要初始化的FreeType,获取管理器,在我不使用它之后,我必须反初始化它。当然,它只能初始化一次,如果已经初始化,则只能取消初始化 我提出的(只是一个例子,不是真正的代码[但是可以是有效的C++代码]): 对于我创建的每个管理器(FreeType、AudioManager、EngineCore、DisplayManager),它们几乎都是一样的:没有实例,只有静态的东西。我可以看出,每次重写这个框架都可能是一个糟糕的设计实践。也

我正在制作一个游戏引擎,我正在使用库来完成各种任务。例如,我使用需要初始化的FreeType,获取管理器,在我不使用它之后,我必须反初始化它。当然,它只能初始化一次,如果已经初始化,则只能取消初始化

我提出的(只是一个例子,不是真正的代码[但是可以是有效的C++代码]):

对于我创建的每个管理器(FreeType、AudioManager、EngineCore、DisplayManager),它们几乎都是一样的:没有实例,只有静态的东西。我可以看出,每次重写这个框架都可能是一个糟糕的设计实践。也许有更好的解决办法


改用单例会好吗?或者有适合我的问题的模式吗?

如果您仍然需要单例方法(哪种方法对管理器类型的对象有意义),那么为什么不将其设置为适当的单例,并使用静态的
get
函数,如果需要,该函数可以创建管理器对象,并拥有管理器(私有)构造函数在析构函数中处理初始化和反初始化(尽管管理器类型的对象通常具有整个程序的生存期,因此析构函数将仅在程序退出时调用)

差不多

class FreeTypeManager
{
public:
    static FreeTypeManager& get()
    {
        static FreeTypeManager manager;
        return manager;
    }

    // Other public functions needed by the manager, to load fonts etc.
    // Of course non-static

    ~FreeTypeManager()
    {
        // Whatever cleanup is needed
    }

private:
    FreeTypeManager()
    {
        // Whatever initialization is needed
    }

    // Whatever private functions and variables are needed
};


如果您不想要单例,并且类中只有静态函数,那么您最好使用
名称空间
。对于变量,将它们放在实现(源)文件中的匿名命名空间中。或者对数据使用不透明的结构指针(pimpl习惯用法的变体)。

还有另一种解决方案,它不完全是单例模式,但非常相关

class FreeTypeManager
{
public:
   FreeTypeManager();
   ~FreeTypeManager();
 };
 class SomeOtherClass
 {
 public:
   SomeOtherClass(FreeTypeManager &m) : m(m) {}
 private:
   FreeTypeManager &m;
 };
 int main() {
    FreeTypeManager m;
    ...
    SomeOtherClass c(m);
 }

解决方案是保持普通C++类,但只在主(c)开头实例化它。这将初始化/销毁移动到一个稍微不同的位置。您需要通过构造函数参数将对FreeTypeManager的引用传递给每个想要使用它的类


请注意,使用main()而不是其他函数是很重要的;否则,您会遇到范围界定问题,需要思考如何处理..

这就是我要做的。非常感谢。这就像我最后做的一样。我创建了单例,但我有一个控制器类,在其中存储实例以便于访问。谢谢你的提示!
class FreeTypeManager
{
public:
   FreeTypeManager();
   ~FreeTypeManager();
 };
 class SomeOtherClass
 {
 public:
   SomeOtherClass(FreeTypeManager &m) : m(m) {}
 private:
   FreeTypeManager &m;
 };
 int main() {
    FreeTypeManager m;
    ...
    SomeOtherClass c(m);
 }