2012-11-17 1 views
2

그래서 나는이 코드를 시도 :C++ shared_ptr 기반 싱글 톤 무엇이 링크 오류의 원인입니까?

#ifndef TRANSMITTER_H 
#define TRANSMITTER_H 
class connector 
{ 
public: 
    static boost::shared_ptr<connector> Instance(){ 
     if(!instance) 
     { 
      instance = boost::shared_ptr<connector>(new connector()); 
     } 
     return instance; 
    } 
private: 
    connector(){} 
    static boost::shared_ptr<connector> instance; 
}; 
#endif //TRANSMITTER_H 

을하지만 링크 오류 얻을 :

Error 3 error LNK2001: unresolved external symbol "private: static class boost::shared_ptr<class connector> connector::instance" ([email protected]@@[email protected]@@@[email protected]@A) 

I 반환 할 shared_ptr을 잘못 무엇입니까? 그것을 함수 범위의 정적 변수로 만들어야합니까?

+0

[정의되지 않은 참조/확인되지 않은 외부 기호 오류 란 무엇이며 어떻게 해결할 수 있습니까?] (http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved- 외부 기호 오류 및 방법 i-fix), 특히 마지막 항목의 http://stackoverflow.com/a/12574407/635608 – Mat

답변

12

을 transmitter.cpp를 들어, 단지 선언입니다 : 여기에 정의의 모습입니다. 당신이 가지고 있지 않은 것은 정의입니다. 이 정의은 클래스 정의 외부에 있습니다.

그러나, 당신은 아마이 작업을 수행하는 것을 선호한다 :이 경우 instance에서

class connector 
{ 
public: 
    connector(connector const&) = delete; 
    connector& operator=(connector const&) = delete; 

    static boost::shared_ptr<connector> Instance() 
    { 
     static boost::shared_ptr<connector> instance (new connector); 
     return instance; 
    } 
private: 
    connector(){} 
}; 

Instance의 인라인 함수 정의 내부의 정적 기능 로컬 객체로을 정의합니다. 좋은 점은 초기화의 이런 종류가 C++ 11에서 쓰레드 안전성이 보장된다는 것입니다.

+0

이 질문에 대한 답변은 특히 스레드 안전성에 대한 힌트입니다. 나에게 불만이있는 것은, 제시된 싱글 톤이 복사 가능하다는 것입니다, 그렇지 않습니까? 둘 다 가질 수 있습니까? 복사 불가능한 shared_ptr-singleton? – AquilaRapax

+0

@AquilaRapax : 좋은 지적입니다! 네, 저는 이것이 쉽게 가능해야한다고 생각합니다. 나는 단순히 복사본 ctor를 비공개로 만들거나 삭제 된 기능으로 바꾸는 것이다. – sellibitze

1

당신은 당신의 *의 .CPP이 링커는 정적 데이터 영역에서이 정적 멤버에 대한 메모리를 할당하게 에

boost::shared_ptr<connector> connector::instance; 

을 정의해야합니다.

1

클래스 선언 외부에서 정적 멤버를 정의해야합니다. 그것은 CPP에 있어야

boost::shared_ptr<connector> connector::instance; 

당신은 아마 당신의 클래스 정의 내에서이

static boost::shared_ptr<connector> instance;