Недавно у меня возник вопрос о реализации Singleton, но был использован абстрактный базовый класс. Предположим, что у нас есть иерархия классов:
class IFoo {...}; // it ABC
class Foo : public IFoo {...};
мы имеем одноэлементный класс, определяемый следующим образом:
template <typename T>
class Singleton
{
public:
static T* Instance() {
if (m_instance == NULL) {
m_instance = new T();
}
return m_instance;
}
private:
static T* m_instance;
};
Итак, если я хочу использовать, как показано ниже: IFoo::Instance()->foo();
что мне делать?
Если я это сделаю: class IFoo : public Singleton<IFoo> {...};
он не будет работать, поскольку Singleton будет вызывать IFoo ctor, но IFoo - это ABC, поэтому его нельзя создать.
И это: class Foo : public IFoo, public Singleton<Foo> {...};
тоже не может работать, потому что в этом случае класс IFoo не имеет интерфейса для метода Instance(), поэтому вызов IFoo::Instance()
завершится с ошибкой.
Любые идеи?