현재 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;