2

言語 C++ で与えられたコード

/* file xxx.hpp */

class A
{
};

class B
{
private:
    class C
    {
        static const A a;
    };
};

A aネストされたクラス C で静的定数メンバー変数を初期化するにはどうすればよいですか?

4

5 に答える 5

5

以下を 1 つだけに追加します.cpp

const A B::C::a;

投稿されたコードは単なる宣言であることに注意してください。これは実際の定義と初期化です。

于 2012-08-01T21:44:13.463 に答える
4

コンパイルするコードを含む cpp ファイルに、const A B::C::a = {};. 初期化子 (POD クラスまたは集約型の {...} 内の初期化子リスト、または組み込み型の単一の定数値) はオプションです。指定されていない場合は、デフォルトのコンストラクターが呼び出されaます。プリミティブ型の場合は、0 に設定する必要があります。

更新しました:

David が以下で大きく指摘しているように、一部のコンパイラは、静的メンバ定義に初期化子が指定されていない場合に警告を発行します。にいくつかのデータ メンバーがclass Aあり、の定義中に初期化子aが指定されていない場合、私の g++ 4.6.3 コンパイラは次の警告を発行します (つまり、既定ではエラーとして扱われます)。

test.cpp:26:9: エラー: 初期化されていない const 'B::C::a' [-fpermissive]

test.cpp:6:7: 注: 'const class A' にはユーザー指定のデフォルトがありません

コンストラクター test.cpp:11:8: 注: 暗黙的に定義されたコンストラクターは 'int A::test' を初期化しません</p>

于 2012-08-01T21:44:29.403 に答える
3

staticレギュラーメンバーと同じように。

実装ファイルで:

const A B::C::a;
于 2012-08-01T21:42:52.517 に答える
3

静的メンバー変数の初期化は、常に変数の定義で実行されます。これは、プログラム内の単一の翻訳単位にある必要があります。

const A B::C::a = {};
于 2012-08-01T21:43:50.577 に答える
3

ソース ファイル (xxx.cpp) で、次の変数を定義します。

const A B::C::a;
于 2012-08-01T21:44:04.260 に答える