为什么这个单例模式不起作用?

Xai*_*anX 0 c++ singleton

我有两个单例,第一个标题看起来像这样(我省略了与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
Run Code Online (Sandbox Code Playgroud)

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

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

这是构造函数:

TextureManager::TextureManager()
{
    fontManager=FontManager::Instance();
}
Run Code Online (Sandbox Code Playgroud)

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

但是代替那个程序进入无限循环,因为(我不知道为什么)Instance()方法总是创建一个新实例.我if (instance==0)总是评价为真.

Nic*_*ick 7

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

因为构造函数必须在分配静态变量之前完成,所以最终会在此循环中结束.