2014-02-26 2 views
0

현재 dlopen을 사용하여 싱글 톤 및 동적 라이브러리를 많이 사용하는 응용 프로그램에서 작업하고 있습니다.
내 문제는 응용 프로그램 내에서 동적 라이브러리 내에서 내 싱글 톤의 인스턴스가 다른 점이다 (즉, 내 구현에서 싱글 :: getInstance 메소드가 다른 주소를 반환)정적 응용 프로그램이 주 응용 프로그램의 동적 라이브러리 내에서 다릅니다.

이 내가 싱글

정의하는 방법이다 나는 싱글이 될 수있는 수준의 테스트를 원하는 경우
// Singleton.hpp 
template<typename T> 
class     Singleton 
{ 
    static T    *_instance; 

protected: 
    Singleton<T>() {} 
    virtual ~Singleton<T>() {} 

public: 
    static T    *getInstance() { 
    if (_instance == NULL) 
     _instance = new T; 
    return (_instance); 
    } 

    static void   deleteInstance() { 
    if (_instance) { 
     delete _instance; 
     _instance = NULL; 
    } 
    } 
}; 

template<typename T> 
T      *Singleton<T>::_instance = NULL; 

다음, 내가 수행해야합니다

// Test.hh 
#include     "Singleton.hpp" 

class      Test : public Singleton<Test> 
{ 
    friend class    Singleton<Test>; 

private: 
    Test(); 
public: 
    virtual ~Test(); 

    void      doSomeStuff(); 
}; 

을 지금은 테스트를 사용하려면, 내가 할 :

#include     "Test.hh" 

int      main() { 
    Test      *test = Test::getInstance(); 

    test->doSomeStuff(); 
    return (0); 
} 

문제를 해결하기 위해 정적 클래스 멤버 인 Singleton :: _ instance를 "extern"(키워드 사용)하려고 시도했지만 응용 프로그램을 컴파일하지 못했습니다 ... GCC는 그런 종류의 코드를 거부합니다. Singleton.hpp 파일에서 :

template<typename T> 
extern T     *Singleton<T>::_instance; 

답변

1

다음은 singleton.hpp에서 이동해야합니다. 작성된대로 singleton.hpp를 포함하는 각 .cpp 파일에 대한 포인터의 인스턴스를 만듭니다.

template<typename T> 
T      *Singleton<T>::_instance = NULL; 

이것은 선언이 아니라 정의임을 기억하십시오. 그래서 헤더를 포함하는 모든 객체 파일은 이제 Singleton :: _ instance를 정의합니다. 여러 .cpp 파일에 singleton.h가 포함되어 있고 단일 대상 (실행 파일 또는 라이브러리)에 같은 유형의 템플릿을 인스턴스화하면 여러 정의 기호가 생깁니다.

이 코드를 올바르게 작성하려면 싱글 톤 템플릿의 클라이언트에서 단일 .cpp 파일을 선택하고 거기에 _instance를 정의해야합니다. 이것은 분명히 매우 바람직하지 않으므로 싱글 톤 (첫 번째, 최상의 옵션)을 사용하거나 다른 싱글 톤 패턴을 사용하지 마십시오.

관련 문제