2010-01-27 3 views
7

현재 싱글 톤으로 팩토리를 구현하려고합니다. 나는 실질적으로 싱글 톤 패턴의 교과서 예제를 사용했다. 여기에 .H 파일입니다 :C++ : Singleton 클래스의 인스턴스에 대한 정의되지 않은 참조

namespace oxygen{ 

class ImpFactory{ 

public: 
    static boost::shared_ptr<ImpFactory> GetInstance(); 

private: 
    static boost::shared_ptr<ImpFactory> mInstance; 
}; 

여기 .cpp 파일입니다 :

#include "impfactory.h" 

using namespace oxygen; 
using namespace boost; 

shared_ptr<ImpFactory> ImpFactory::GetInstance(){ 
    if (mInstance.get() == 0) 
     mInstance = shared_ptr<ImpFactory>(new ImpFactory()); 
    return mInstance; 
} 

코드는 컴파일,하지만 난 링커 오류 얻을 : 이것은 현재 세 학생들이

../../lib/oxygen/liboxygen.so.3.2.4: undefined reference to `oxygen::ImpFactory::mInstance'

을 엉망진창. 어떤 아이디어?

답변

13

정적 인스턴스를 정의해야합니다. 선언하지 말아야합니다. 정의는 참조하는 실제 오브젝트를 작성합니다.

boost::shared_ptr<ImpFactory> ImpFactory::mInstance; 
2

당신은 CPP 파일에서 정적 멤버에 대한 정의가 필요합니다 : 당신의 cpp 파일에서

는 줄을 추가합니다. 당신의 C에서

boost::shared_ptr<ImpFactory> ImpFactory::mInstance; 
2

++이 추가

boost::shared_ptr<ImpFactory> ImpFactory::mInstance; 
0

을 다른 보조 노트에, 어쩌면 당신이 인스턴스가 아니라 클래스보다 get 함수의 정적 멤버를 포인터를해야한다, 이것은 너무하지 않습니다 새로운/포인터 방법을 사용할 때 많은 차이가 있습니다. 하지만 정적 인스턴스 (즉 포인터를 사용하지 않고 get 함수에서 참조를 반환하는 경우)는 다음과 같은 이유로 큰 차이를 만듭니다.

클래스의 정적 멤버 인 경우 해당 생성자는 다음과 같습니다. get 함수의 정적 멤버 인 경우에는 처음부터 호출되지 않을 때까지 생성되지 않으며, 이는 사람들이 싱글 톤으로 갖는 문제의 일부를 완화 시키며, 영광스러운 전역이며, 다른 좋은 점 대부분의 링커는 get 함수를 생략 할 것이고 따라서 호출되지 않으면 정적 인스턴스를 완전히 생략 할 것이므로 사용하는 경우 메모리 만 사용하도록 new 호출에 대해 걱정할 필요가 없습니다.

0

부스트를 사용 중이므로 부스트 싱글 톤 클래스를 고려해 볼 수 있습니다. 체크 아웃 :

#include <boost/serialization/singleton.hpp> 

using namespace boost::serialisation; 

struct MyClass : public singleton<MyClass> 
{ string name_; int age_; }; 

int main(int argc, char* argv[]) 
{ 
    MyClass::get_mutable_instance().name_ = "Robin"; 
    MyClass::get_mutable_instance().age_ = 21; 
} 

당신이하고있는 일은 당신이하는 일에 달려 있습니다. 보통의 이유로 반 독점적 인 사람이지만 가능한 경우 재사용하는 것이 좋습니다. 경고 단어 : Boost 싱글 톤이 라이브러리에서 조금 움직 인 것처럼 보입니다. 따라서 Boost의 버전에 따라 다를 수 있습니다.

+0

"사람들이 싱글 톤을 원한다고 생각할 때 추가 된 다음 결국 좋은 생각이 아님을 알았을 때 제거 된 것"으로 "옮겼습니다"라고 생각하지 않습니다. –