2011-09-10 7 views
1

私は次のような状況があります。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); 

... 
関連する問題