inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

변수와 레지스터

static 멤버 변수 질문

386

starkshn

작성한 질문수 134

0

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

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

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

class Knight

{

private:

static int _test;

};

int Knight::_test = 0;

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

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

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

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

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

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

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

C++

답변 1

0

Rookiss

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

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

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

561

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

456

1

strcpy() 구현 관련 질문

0

543

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

477

1

클래스 타입의 포인터 질문합니다

0

560

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

504

1

템플릿 특수화 관련 질문

0

392

1

포인터 관련 질문합니다!

0

276

1

Unable to start assembler. Check your settings.

0

851

2

cpu선택

0

552

1

포인터 질문이 있습니다

0

335

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

592

1

iterator 삭제관련

0

419

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

316

1

15 분 45초 대 질문

0

319

0

스택 프레임 질문합니다!

2

316

1

오른값 참조 in 게임

0

394

0

동적할당 질문이 있습니다

0

460

1

안녕하세요 메모리에 대해 질문드립니다.

0

314

1

함수객체 의 매개변수

0

370

1

복사생성자

0

441

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

431

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

360

1

스택 오버플로우

2

804

1