티스토리 뷰
[C++] Class Static Member Variable(C++ 스태틱 멤버변수) 초기화를 Header File에서 해보자
developer0hye 2022. 1. 24. 21:55며칠전에 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
https://stackoverflow.com/a/15959493/10386667
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로 반환안해도된다.
'C++' 카테고리의 다른 글
Variadic functions / c/c++ 이 가변 인자를 받을 수 있었다고??... (0) | 2022.06.03 |
---|---|
Cpp + VSCode + CMake + MSVC Compiler on Windows (0) | 2022.03.15 |
[C++] zero padded number 변환 (0) | 2021.12.30 |
[C++] multiple definition of ~ 전담 수비수 static, namespace (0) | 2021.07.29 |
[C++] const map 객체 value 접근 (0) | 2021.07.15 |
- Total
- Today
- Yesterday
- 백준 11053
- 순열
- 단축키
- 백준 1766
- FairMOT
- 인공지능을 위한 선형대수
- 백트래킹
- LCA
- 문제집
- 가장 긴 증가하는 부분 수열
- PyCharm
- 백준 11437
- ㅂ
- 백준
- 위상 정렬 알고리즘
- Lowest Common Ancestor
- 자료구조
- 파이참
- 이분탐색
- 조합
- C++ Deploy
- cosine
- MOT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |