2011-08-16 11 views
4
class Foo { 
private: 
    int m_i; 

public: 
    Foo(int i) : m_i(i) {} 
}; 

class FooA 
{ 
private: 
    const static Foo & m_foo; 
    static Foo & m_foo2; 
}; 

Q1> const 정적 참조를 초기화하는 방법은 무엇입니까?const/non-const 정적 참조 멤버를 초기화하는 방법은 무엇입니까?

Q2> const가 아닌 정적 참조를 초기화하는 방법은 무엇입니까?

참고 : 메소드를 설명하기 위해 FooA 클래스를 변경할 수 있습니다.

답변

10

가 초기화되지 않은 기준 static 부재 :

//Foo.cpp 

const Foo & FooA::m_foo = fooObj1; 
Foo & FooA::m_foo2 = fooObj2; 

fooObj1fooObj2Foo 글로벌 변수 .

fooObj1fooObj2 그렇지 않으면 static initialization order fiasco 문제에 직면 수도 m_foom_foo2 전에 초기화해야합니다.

+2

+1 (이 할당은 헤더가 아닌 소스 파일에 있어야합니다.) 정적 초기화 순서 실패 문제에 대한 설명에 대해 또 다른 +1을 할 수 있습니다. –

+0

@Nawaz, 다음 코드가 합법적이라고 생각하십니까? 'const Foo & FooA :: m_foo = Foo (10); Foo & FooA :: m_foo2 = Foo (10);' – q0987

+0

@ q0987 : 컴파일 해 보셨습니까? 성공적으로 컴파일합니까? 첫 번째 줄은 컴파일되지만'm_foo'를 사용할 수 없습니다. 그걸하지 마라. 이것을 넣으십시오 :'Foo foo1 (10), foo2 (20); const Foo & FooA :: m-foo = foo1; Foo & FooA :: m_foo2 = foo2;' – Nawaz

5

다른 정적 데이터 부재와 동일한 방식 : 동일한 방식

Foo foo(5); 
const Foo& FooA::m_foo(foo); 
Foo& FooA::m_foo2(foo); 
3

static 및 non-const 정적 참조를 정적 멤버를 초기화하는 것과 같은 방식으로 초기화합니다. 전역 범위에 초기화를 배치합니다.

const Foo& FooA::m_foo = ...whatever... 
Foo& FooA::m_foo2 = ...whatever... 
관련 문제