• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

static 멤버 변수 질문

22.08.25 10:31 작성 조회수 188

0

현재 초기화 한 정적, 전역 변수는 Data영역에 올라가고

초기화 하지 않은 정적, 전역 변수는 Bss영역에 올라간다고하는것 까지는 이해가 되었습니다.

그런데 클래스안의 정적 멤버 변수의 경우

class Knight

{

private:

static int _test;

};

int Knight::_test = 0;

이렇게 클래스 밖에서 초기화를 해주어야 링크 오류가 안나는거 같더라구요 구글리을 해보아도 그냥 밖에다 선언해라 그래야 링크 오류가 안난다고 하는데

저는 궁금한게 C++11문법을 사용해도 클래스 내부에서 초기화가 불가능 하더라구요

이거는 당연히 '정적'이기 때문에 접근만 Knight를 통해서 가능한 것이지 데이터는 실제로 데이터영역에 올라가 있기 때문, 또한 클래스에 딱하나만 존재를 하는 것이라 이해를 해서 (객체를 또 여러개 생성할 수 있는데 그때마다 초기화가 되면안되니까 등등의 이유로) 클래스 내부에서는 초기화를 하면 안되는 것은 이해 하였습니다.

그런데 정적 멤버 변수의 경우 초기화를 안하면 BSS에 올라가고

초기화를 해주면 DATA영역에 올라가야 하는것 아닌가요?

왜 클래스 외부에서 초기화를 해주지 않으면 링크 오류가 뜨나요..??

(구글링 해보아도 그냥 클래스 객체 전부가 공유하니까 초기화를 해주어야 한다. 이정도 인거같아서 뭔가 답답한 부분이 있는거 같습니다..ㅠ)

답변 1

답변을 작성해보세요.

0

class 안에 있는 static은 아직 실체가 없고 그냥 설계도에만 존재하는 것이라
실제로 '어딘가'에 변수 선언을 해서 실체를 만들어줘야 합니다.
(.h에서 함수를 정의만 하고 .cpp 실제 구현부를 만들지 않으면 링크 에러가 뜨는 것처럼)

C++은 워낙 문법이 복잡하고 난해해서
이런 사소한 부분에 대해 '답답함'을 느끼기보단 그냥 실험을 통해 익히고 넘어가는게 좋습니다.
(나중에 기회가 되면 C++ 컴파일러 관련된 원서를 따로 보면 되겠죠)