정적 멤버 변수를 갖는 클래스를 상속할때 그 변수의 초기화 순서
글쓴이: jinserk / 작성시간: 목, 2011/08/18 - 10:24오전
안녕하세요?
c++ 에서 아래와 같이 A 클래스를 상속하는 B 클래스가 있습니다.
class A { protected: static struct Member { int m_c; Member(int c) { m_c = c; } } a; }; A::Member A::a(1); class B : public A { private: static struct ChildMember { int m_c; ChildMember(Member& r) { m_c = r.m_c; } } b; }; B::ChildMember B::b(a);
개념은 위와 같은데, 저럴때 B::b 의 m_c 를 찍어보면 1이 아닌 이상한 값이 들어가 있네요.
아마도 정적 변수의 초기화 순서가 안지켜지는 듯 한데, 저런 경우 어떻게 초기화 순서를 정할 수 있을까요?
감사합니다.
Forums:
아래 코드로 하니 1 이라고 잘 나오는데요?
정적 멤버 객체 초기화 방식은 저도 처음보네요.. 동작은 잘 되네요...
저는 C++ 에 대해서도 잘 알지는 못합니다. C++ 스펙에 근거한 설명까지 해드릴 정도는 못되네요...
Visual Studio 2008 입니다. Win32 Console Project 구요..
Effective C++ 3판 75쪽에 관련된 내용이 있는 것 같네요
서로 다른 번역 단위에서 정의된 비지역 정적 객체들의 초기화 순서는 '정해져 있지 않다' 라고 나와있네요.
만약 A::Member A::a(1)과 B::ChildMember B::b(a)이 서로 다른 cpp파일에 있다면 A::a, B::b 초기화 순서는 정의되어있지 않은 셈이 됩니다.
클래스 범위 말고 함수 안에 정적 객체를 선언해 초기화 순서를 강제하는 트릭이 소개되어있습니다.
:)
댓글 달기