2010-08-20 9 views
2

Как создать экземпляр синглтона, который можно использовать в других классах?Использование Singleton в разных классах

Для примера:

//Singleton_Class.h 

#ifndef Singleton_Class 
#define Singleton_Class 

class Singleton 
{ 
private: 
    static Singleton _instance; 

    Singleton() {} 
    ~Singleton() {} 
    Singleton(const Singleton &); 
    Singleton & operator=(const Singleton &); 

public: 
static Singleton &getInstance(){return _instance;} 
}; 

Singleton Singleton::_instance; 

#endif 


//Main.cpp 

#include "Singleton_Class.h" 

int main() 
{ 
    Singleton &s = Singleton::getInstance(); //Use the instance 
} 

//ClassA.cpp 

#include "Singleton_Class.h" 

class A 
{ 
public: 
A(){}; 
}; 

я получаю связывающую ошибку при попытке включить единый заголовок класса для класса А (LNK2005): "частное: статический класс Singleton Singleton :: _ экземпляр"? (_instance @ Singleton @@ 0V1 @ A), уже определенный в Singleton Class.obj

ответ

6

Вам необходимо определить переменную экземпляра в одном из файлов источника (.cpp), а не в файле заголовка.

Если переменная экземпляра определена в заголовочном файле, тогда, когда этот заголовочный файл включен в несколько исходных файлов, он получает определение несколько раз (что и говорит об ошибке).

5

Джеймс уже сказал вам, что проблема: вам нужно переместить определение переменной 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;} 
}; 
Смежные вопросы