У меня есть два одиночек, заголовок первый из выглядит следующим образом (я пропустил все, что не связано с шаблоном 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 с TextureManager :: Instance(), и этот метод возвращает экземпляр TextureManager, который уже существует. Правильно?
Но вместо этого программа вводит бесконечный цикл, потому что (я не знаю почему) методы Instance() всегда создают новый экземпляр. Мне нравится, что if (instance==0)
всегда оценивается как true.
Зачем вам этот шрифтManager? это также Singleton ... так что вы можете использовать его позже ... не в конструкторе textureManager – fen