부모클래스의 static 변수 정의 질문입니다!

조회수 907회
template <typename T>
class Singleton
{
protected:
    Singleton() {}
    Singleton(const Singleton& single) {}
    ~Singleton() {}

protected:
    static T*   m_pInst;

public:
    static T* GetInst()
    {
        if (!m_pInst)
            m_pInst = new T;
        return m_pInst;
    }
    static void DesInst()
    {
        if (m_pInst)
            delete m_pInst;
        m_pInst = NULL;
    }
};

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

템플릿으로 하면 선언되는 자료형 T 에 따라 static 변수가 여러개 생길줄알았는데 자식클래스에서 static 변수를 정의하려니 오류가 생기네요..

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

이런식으로 작성했을때 오류가 안났는데 맞는 방법일까요? 어떻게 저런방식이 허용되는지 궁금합니다

1 답변

  • 일단 부모 클래스의 정적 멤버 변수(static member variable)는 자식의 이름으로 정의하는 것을 허용하지 않습니다.

    헤더에 일반 클래스의 정적 멤버 변수를 아래와 같이 헤더에 작성하고, 여러 cpp 파일에서 헤더를 include하면 중복 정의문제가 발생합니다.

    class Normal {
    public:
        static int* number;
    };
    int Normal::number = 10;
    

    이는 include과정에서 int Normal::numbrer = 10; 이란 코드가 여러 cpp 파일에 붙여 넣어진 후 컴파일되어 number 가 여러 곳에 존재하기 때문입니다.

    하지만 이에 반해 템플릿 일 경우에는 이야기가 달라집니다. 아시다시피 템플릿은 헤더에 정의를 하게됩니다. 클래스 템플릿의 정적 멤버 변수는 정적 멤버 변수를 정의하실 때 이 변수를 cpp 파일에 정의를 해야하나 아니면 템플릿이니 헤더에 정의해야하나 라는 교착상태에 빠지실 것입니다.

    이런 경우가 있기에 클래스 템플릿의 정적 멤버 변수는 예외로 헤더에 정의하는 것을 허용합니다. 이 경우 컴파일러가 변수가 한번만 생성되도록 관리해줍니다.

    이와 유사한 변수 템플릿이란게 C++14 부터 추가되었습니다.

    • 와,, 정말 감사드립니다, 제가 드린 질문 대부분이 동욱님께서 명쾌한답변을 주시네요 ㅠㅠ 알 수 없는 사용자 2018.7.29 12:23

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)