我有两个单例,第一个的标头如下所示(我省略了与单例模式无关的所有内容):

#ifndef TEXTUREMANAGER_DEFINED_H
#define TEXTUREMANAGER_DEFINED_H
class FontManager;
class TextureManager
{
private:
    static TextureManager *instance;
    TextureManager();
public:
    FontManager *fontManager;
    static TextureManager* Instance();
};

#endif


在实现中,这是Instance()方法(以及实例静态成员的初始化):

#include "FontManager.h"
TextureManager * TextureManager::instance = 0;
TextureManager* TextureManager::Instance ()
{
    if (instance==0)
        instance=new TextureManager;
    return instance;
}


这是构造函数:

TextureManager::TextureManager()
{
    fontManager=FontManager::Instance();
}


第二个单例(FontManager的)设计是完全相同的,但不是FontManager指针具有TextureManager指针,并且在其构造函数中,它使用TextureManager :: Instance()初始化了该指针。
这应该像这样工作:首先实例化TextureManager(在程序启动时),并在其构造函数中首次实例化FontManager单例调用FontManager :: Instance()。 FontManager在其构造函数中,使用TextureManager :: Instance()将其指针分配给TextureManager,并且此方法返回已存在的TextureManager实例。对?

但是相反,程序会进入无限循环,因为(我不知道为什么)Instance()方法总是创建一个新实例。我不喜欢if (instance==0)总是评估为true。

最佳答案

因为您编写了一个无限循环,其中TextureManager的构造函数调用FontManager的构造函数,然后又调用TextureManager ....的构造函数,依此类推。

由于构造函数必须在分配静态变量之前完成,因此您将最终陷入此循环。

10-05 18:13