2011-09-10 4 views
1

의 클래스 멤버 I 다음과 같은 상황이 :C++ 같은 종류

class Foo 
{ 
public: 
    static const Foo memberOfFoo; 

    ........ 
} 

그래서 것은, 내가 그것을 선언 어디 같은 라인을 초기화 할 수 없습니다, 그리고 내가 통해 초기화 할 수 없습니다를 초기화 목록 생성자의 목록, 누구든지 무엇을 해야할지 알고 있습니까?

답변

6

다음 클래스 정의의 외부를 넣어 추가하여, 어딘가에 (그리) memberOfFoo를 선언해야합니다 이니셜 라이저를 제공 할 수 Foo::memberOfFoo의 정의입니다

const Foo Foo::memberOfFoo = whateverValue; 

.cpp 파일에 있어야합니다 (다른 모든 개체 정의와 마찬가지로 전체 프로그램에서 한 번만 나타날 수 있습니다. 그렇지 않으면 링커 오류가 발생합니다). A::x 주소-찍은 적이 및 매개 변수를 참조로 전달되지 않습니다 만 그 유효처럼

struct A { 
    // sometimes, code won't have an "const int A::x;" anywhere! 
    static const int x = 42; 
}; 

정의를 생략 :

때로는 정적 데이터 멤버에 대한 정의가없는 코드를 찾을 수 있습니다. 정의를 생략하는 것이 유효한 경우를 말하면서보다 공식적인 방법은 : "A :: x의 모든 용도가 즉시 A :: x의 저장된 값을 읽을 때"입니다. 많은 정적 정수 상수의 경우입니다. 이것은 당신이 초기화를 구현할 수있는 방법입니다

2

상수 정수형 이외의 클래스 정적은 정의 시점에서 초기화 할 수 있어야합니다. 당신은

const Foo Foo::memberOfFoo = /*construct here*/; 
0

...

class Foo 
{ 
public: 
    static const Foo memberOfFoo; 

    Foo(int, double) 
    { 
     ... 
    }; 
}; 

const Foo Foo::memberOfFoo(42, 3.141592654); 

...