我有两个单身,第一个标题看起来像这样(我省略了与Singleton模式无关的所有内容):
#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)
评估为真。
答案 0 :(得分:7)
因为你编写了一个无限循环,其中TextureManager
的构造函数调用FontManager
的构造函数,然后调用TextureManager
的构造函数....等等。
因为构造函数必须在分配静态变量之前完成,所以你最终会进入这个循环。
答案 1 :(得分:0)
对于单例,您不会将构造函数公开为公共接口。相反,您有一个单独的静态实例检索成员函数和一个私有构造函数:
class Foo
{
Foo() { /* ... */ }
public:
static Foo & get()
{
static Foo instance; // uses private constructor
return instance;
}
};
除了静态成员,你也可以做你的指针技巧,但是你应该有一个static std::unique_ptr<Foo>
来确保程序结束时的正确销毁。