2015-01-23 1 views
0

메모리 할당없이 싱글 톤 디자인 패턴을 구현하려고합니다. 나는 해결책을 찾고자했지만 모든 해결책이 메모리 할당으로 정의 된 싱글 톤을위한 것 같았다.C++ Singleton :`정의되지 않은 참조 '오류

나는 생성자는 비공개 내가 헤더 파일에 추가 된 코드 만이 싱글 톤 디자인 패턴이었다 만들기 위해 :

static ParametersServerPC& ParametersServerPC::GetInstance() { 

    static ParametersServerPC instance; 
    return instance; 

} 

이 빈 생성자가 기본 클래스 ParametersServerABS에서 파생 클래스입니다 정의. ParametersServerABS은 추상 클래스입니다.

내가 별도의 파일에 ParametersServerPC 클래스를 인스턴스화하려고

:

parameters_server_abs : 여기

undefined reference to `ParametersServerPC::GetInstance()' 

.cpp.hpp 파일입니다

ParametersServerPC& paramServer = ParametersServerPC::GetInstance(); 

나는이 오류가 발생합니다. hpp :

parameters_server_abs.cpp :

#include "mid_level/parameters_server_abs.hpp" 

ParametersServerABS::ParametersServerABS() {} 

ParametersServerABS::~ParametersServerABS() {} 

parameters_server_pc.hpp :

#ifndef PARAMETERS_SERVER_PC_HPP_ 
#define PARAMETERS_SERVER_PC_HPP_ 

#include <string> 

#include "mid_level/parameters_server_abs.hpp" 

class ParametersServerPC: public ParametersServerABS { 

    public: 

     ~ParametersServerPC(); 

     static ParametersServerPC& GetInstance(); 

     virtual bool Load(); 

    private: 

     ParametersServerPC(std::string parameterFileName = "parameters.txt"); 

     std::string _parameterFileName; 

}; 

parameters_server_pc.cpp :

#include "mid_level/parameters_server_pc.hpp" 

ParametersServerPC::ParametersServerPC(std::string parameterFileName = "parameters.txt") : 
     _parameterFileName(parameterFileName) { 

} 

ParametersServerPC::~ParametersServerPC() { 

} 

static ParametersServerPC& ParametersServerPC::GetInstance() { 

    static ParametersServerPC instance; 
    return instance; 

} 

virtual bool ParametersServerPC::Load() { 

    return true; // TODO 

} 

my_test_file.cpp

#include "mid_level/parameters_server_pc.hpp" 

ParametersServerPC& paramServer = ParametersServerPC::GetInstance(); 
,174,
+0

'ParametersServerPC'의 모든 코드를 게시 할 수 있습니까? 'GetInstance()'는 괜찮아 보이지만 정의에는'static'이 필요 없습니다. –

+0

'ParametersServerABS'는'PC' 클래스가 파생 된 추상 클래스입니다. 그것은 단지 public 생성자와 소멸자를 가지고 있습니다. 내가 아직 정의하지 않은 가상 함수와 함께. 'PC' 클래스의 GetInstance() 코드는 헤더 파일에 있습니다. 지금 가지고있는 것은 모두 소멸자와 개인 생성자입니다. –

+0

@VictorPolevoy 잠깐. –

답변

1

undefined reference to `ParametersServerPC::GetInstance()'

이것은 링커 오류 인 것 같습니다. 편집 콘솔의 출력을 게시 할 수 있다면 우리는 이것을 더 상세히 좁힐 것입니다.

한편, 빌드 시스템을 점검하고 컴파일에서 일부 소스 파일을 생략했는지 확인할 수 있습니다.

싱글 톤 패턴에는 이미 좋은 답변이 있습니다. 주제에 대한 자세한 내용은 in a description of the patternin a general question about singletons입니다.

+0

예 .cpp 파일을 포함하기 위해 CMake 파일을 편집해야했습니다. 감사! –

1

허용되는 패턴입니다. 여기에 feasability을 보여주는 MVCE입니다 :

#include <iostream> 
#include <string> 

using namespace std; 

class A { 
public: 
    int ival; 
    string strval; 

    static A& getInstance(); 
private: 
    A(int ival, string strval): ival(ival), strval(strval) {} 
    A(A& src): ival(src.ival), strval(src.strval) {} 
    ~A() {}; 
}; 

A& A::getInstance() { 
    static A instance(1, "foo"); 

    return instance; 
} 



int main() { 
    A& a = A::getInstance(); 
    cout << a.ival << endl; 

    // A a1 = A::getInstance(); error 
    // A a2 = a; error 
    // A a3(2, "bar"); error 

    return 0; 
} 
+0

소멸자가 비공개 여야합니까? 아마 그게 내 문제 야. –

+0

@JustinLiang 생성자는 private이므로 클래스 외부에 다른 인스턴스를 만들 수 없습니다. 나는 모든 시도가 A * pa = A :: getInstance();를 수행 할 수 있도록 private만을 사용하여 소멸자를 작성했다. delete pa;'컴파일 타임에 오류로 감지되었습니다. 어쨌든'instance'는'new'로 할당되지 않았기 때문에 런타임 에러가 될 것입니다. –

1

먼저, 제대로 개체를 삭제할 수 있도록 ~ParametersServerABS(); 소멸자 virtual를 표시합니다. 둘째로 virtualstatic 키워드를 parameters_server_pc.cpp 파일에서 제거해야합니다.이 파일은 정의 (헤더 파일 용) 전용입니다.

다음, 바로 그것을 수행

class ParametersServerPC { 
    // your code 

    private: 
     ParametersServerPC(std::string parameterFileName = "parameters.txt"); 
     ParametersServerPC(ParametersServerPC const&) = delete; 
     void operator=(ParametersServerPC const&) = delete; 
}; 

싱글은 당신이 객체의 복사본을 얻을 수 없음을 의미합니다 : 당신은 복사 생성자의 사용 금지 할 필요가 대입 연산자를 복사합니다. 어쨌든 귀하의 문제는 parameters_server_pc.cpp 파일에있는 static에 있다고 생각합니다. 구현 부분 (cpp 파일)에서 제거하여 문제를 해결하지만 정의 부분 (헤더 파일)에 그대로 두십시오.

+0

첫 번째 질문은,'parameters_server_pc.hpp' 파일에서'static' 키워드를 삭제할 필요가 없습니까? –

+0

아니요, 거기에 그대로두고 'parameters_server_pc.cpp'에서 삭제해야합니다. –

+0

도움을 주셔서 감사합니다! 모든 변경 사항을 작성한 후에도 오류가 계속 발생하지만 귀하가 알려주었습니다. 'parameters_server_pc.cpp' 파일에있는'GetInstance()'함수 내에서'static' 키워드를 제거하지 않았다는 것을 제외하면 –