티스토리 뷰

며칠전에 Static Member Variable이 정의되어야하는 클래스를 Header-only 형태로 구현해야할 필요가 있었다.

 

그래서 아래처럼 헤더파일안에 Static Member Variable을 초기화하도록 구현을 했다. 예시로 아래처럼 구현을 했다.

class Counter{
  
public:
    Counter()
    {
        std::cout << m_count << std::endl;
        m_count += 1;
    }
private:
    static int m_count;
};

int Counter::m_count = 0;

 

이후 내가 구현한 라이브러리가 링킹된 프로젝트를 Build하는 과정에서 해당 헤더파일이 다중으로 호출되면서 Static Member Variable의 Initialization이 다중으로 발생하여 컴파일러에서 오류가 발생하였다. 이 오류는 빌드 과정에 헤더를 한 번만 호출하도록 하는 전처리기 코드(#pragma once)를 추가한다고 해서 해결되는 오류가 아니였다.

 

저 헤더파일을 위한 별도의 소스파일을 만들어서는 안됐고, 그렇다고 저 초기화 부분을 사용자가 가져다쓸때 외부에서 한 번 명시적으로 초기화 해주도록 만드는 건 내가 싫었다. 무조건 저 헤더 안에서 깔끔하게 초기화 시키고 사용자에게는 저 변수를 굳이 초기화해줘야하는 번거로움을 주기는 싫었다.

 

근데 이 헤더가 프로젝트 내에서 2회 이상 호출되는 이상 이 문제를 피할 수가 없었다.

 

마치 톰 홀랜드의 스파이더맨의 극중 캐릭터처럼 스파이더맨으로 살려는 삶과 피터파커로 살려는 삶이 충돌하는 문제가 발생한 것 이였다.

 

하지만 해결 방법은 있었다. 어디에? 스택오버플로에!

 

https://stackoverflow.com/a/46139631/10386667

 

How to initialize private static members in C++?

What is the best way to initialize a private, static data member in C++? I tried this in my header file, but it gives me weird linker errors: class foo { private: static int i; }; in...

stackoverflow.com

https://stackoverflow.com/a/15959493/10386667

 

How to initialize private static members in C++?

What is the best way to initialize a private, static data member in C++? I tried this in my header file, but it gives me weird linker errors: class foo { private: static int i; }; in...

stackoverflow.com

 

Static Member Variable을 쓰지 않고 Static Member Variable의 느낌을 낼 수 있는 Static Variable이 초기화되는 멤버 함수를 만듦으로써 이 문제를 해결할 수 있었다. 

class Counter{
  
public:
    Counter()
    {   
        int* m_count = return_m_count();
        
        std::cout << *m_count << std::endl;
        *m_count += 1;
    }
private:
    static int* return_m_count()
    {
        static int m_count=0;
        return &m_count;
    }
};

위 코드는 예시인데, pointer로 반환하여 외부에서 static variable의 값을 수정할 수 있게 해주었다. 외부에서 static variable을 수정할 필요가 없으면 굳이 pointer로 반환안해도된다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함