2010-12-01 2 views
9

私のC++コンパイラは、クラス定義でintメンバ変数を初期化しようとすると文句を言います。 「静的const整数データメンバのみをクラス内で初期化することができます」と表示されます。この制限の背後にある理論的根拠を説明してください(可能であれば可能です)。C++でintegerメンバ変数(const staticではない)の初期化が許可されないのはなぜですか?

+0

あなたが言う整数が、定義しているタイプのすべてのオブジェクトに共通でない限り、メンバ変数にはどのような値を割り当てられていますか?その変数static constを呼び出すことは、変数がその型のすべてのオブジェクトに共通であることをコンパイラに伝える方法です。 – vpit3833

+0

私はコンストラクタの初期化を避け、メンバー変数にデフォルト値を与えようとしています。 – Sulla

+1

http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-classおよびhttp://stackoverflow.com/questions/を参照してください。 3575580/rationale-behind-static-const-member-initialization-syntaxを参考にしてください。 – sje397

答えて

8

理論的根拠は、C++の「低レベル」の性質です。これを可能にするなら、コンパイラはすべてのコンストラクタの初期化コードを生成する必要があります。

基本クラスのコンストラクタが明示的に呼び出されない場合でも、基本クラスのメンバーを派生クラスの構築時に初期化する必要があるかもしれません。

スタティックconst積分変数は、オブジェクト作成時にインテラリゼーションを行う必要はありません。

+0

これは同じなので、コンパイラは定数をその値で置き換えることができます。 – Tomas

+0

私の答えを参照してください - 静的は、それがインスタンスではなく、そのようにコンストラクタに関連していないことを意味します。 – EboMike

+0

静的なconst積分は、そのクラスのオブジェクトが構築されるたびに一度しか初期化されません。 –

3

私はちょうどあなたがこれを行うにしようとしている推測している:

class foo { 
    int m_iX = 5; 
}; 

すべての新しく作成されたインスタンスは、この変数を初期化する必要がありますので、これは、コンストラクタで実行されるコードが必要になります。 C++では、コンストラクタ中に実行されるすべてのコードがコンストラクタ自体に(幸運にも)含まれているので、クラスの構築に伴うものはすぐに分かります。さらに、クラスは任意の数のコンストラクタ(コピーコンストラクタを含む)を持つことができるので、この初期化を行うべきかどうかは不明瞭です。

あなたはこれを行うことができます。これは、あなたがfoo::CONSTANTを使用することができます

class foo { 
    enum { 
     CONSTANT = 8 
    }; 
}; 

。これはインスタンス単位ではなくクラス単位で実行されるため動作します。

同様に、あなたがこれを行うことができます:.cppファイルで

class foo { 
    static int sm_iX; 
}; 

int foo::sm_ix = 5; 

を繰り返しますが、これはクラスごとのではなく、インスタンスごと、およびこのような関連性がないようです実際のインスタンスの構築。

ボーナス - このint constを宣言すると、多くのコンパイラがコンパイル時に評価することがあります。いずれかのコンストラクタで:

0

アルン、

私はあなたの質問は、あなたが何をしたい達成するために
Compiler Error C2864

に関連していると信じて、C++は、インスタンスの特定のメンバー(非静的、非コストIE)を初期化する必要があります本文または初期化リスト

4

C++は、非静的データメンバを初期化するコンストラクタ初期化子を使用しているため、静的な制限が存在する:

struct Example { 
    int n; 
    Example() : n(42) {} 
}; 

CONST場合は(かなりの周りに他の方法よりも)特別扱いされているため、CONST制限が存在するので、静的const integralメンバは、通常、名前空間スコープ(C++ 03§7.1.5.1p2、興味があれば)のconst変数に似た内部リンケージがあるかのように扱うことができます。これは、配列サイズなどの整数定数式でメンバーを使用することが主に有益です。

11

現在の標準では許可されていないためです。 According to Bjarne、これをC++ 0xで行うことができます。本当に必要な場合は、コンパイラをC++ 0x(GCCの-std=c++0x)に設定し、コンパイラがそれをサポートしているかどうか確認してください。

関連する問題