Джеймс уже говорил вам, в чем проблема: вам нужно переместить определение переменной static
в отдельный файл .cpp
.
Если вы не хотите иметь файл .cpp
только для переменной, вы можете сделать его локальным static
для функции getInstance()
:
class Singleton
{
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton &);
Singleton & operator=(const Singleton &);
public:
static Singleton &getInstance()
{
static Singleton _instance;
return _instance;
}
};
Это означает ленивую инициализацию, хотя. Обычно это нормально, но иногда вам нужно инициализировать объект до main()
.
Если у вас есть такая проблема, возможно, вы могли бы поместить переменную экземпляра в шаблон класса:
// Beware, brain-compiled code ahead!
template< typename S >
class SingletonBase
{
private:
friend class Singleton;
SingletonBase() {}
public:
static S instance;
};
template< typename S >
S SingletonBase<S>::instance;
class Singleton : private SingletonBase<Singleton>
{
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton &);
Singleton & operator=(const Singleton &);
public:
static Singleton &getInstance(){return instance;}
};