2010-08-20 4 views
2

다른 클래스에서 사용할 수있는 싱글 톤 인스턴스를 어떻게 만듭니 까?다른 클래스에서 싱글 톤 사용

//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(){}; 
}; 

나는 하나의 클래스 A (LNK2005)에 대한 클래스 헤더 포함하려고 연결 오류 얻을 : "개인 : 정적 클래스 싱글 싱글 :: _ 인스턴스를"예를 들어

? (_instance @ 싱글 @@ 0V1 @ A) 이미 싱글 톤 클래스에 정의되어 있습니다. obj

답변

6

헤더 파일이 아닌 원본 (.cpp) 파일 중 하나에서 인스턴스 변수를 정의해야합니다.

인스턴스 변수가 헤더 파일에 정의되어있는 경우 해당 헤더 파일이 여러 소스 파일에 포함되어 있으면 여러 번 정의됩니다 (오류의 의미).

5

제임스는 이미 문제가 무엇인지를 이야기 : 당신이 자신의 .cpp 파일로 정의 static 멤버 변수의를 이동해야합니다.

그냥 변수에 대한 .cpp 파일을하지 않으려면, 당신은 그것에게 getInstance() 함수에 지역 static을 만들 수 :하지만 게으른 초기화를 의미

class Singleton 
{ 
private: 
    Singleton() {} 
    ~Singleton() {} 
    Singleton(const Singleton &); 
    Singleton & operator=(const Singleton &); 

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

을. 일반적으로 Ok입니다. 그러나 가끔 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;} 
}; 
: 그 문제가있는 경우

, 어쩌면 당신은 클래스 템플릿에 인스턴스 변수를 둘 수 있었다