1

どうすればこの動作を実現できますか?

class A
{
    int x;
public:
    A(int x) : x(x) {}
};

class B
{
    A a; // here is the problem
public:
    B() : a(1) {} // solution i found
};

int main(void)
{
    B b;
    return 0;
}

私が見つけた答え以外に、この作品を作る別の方法があるのだろうかと思います。

4

5 に答える 5

4

いいえ、それが適切な解決策です。パラメータなしで初期化できるようにしたくないと明示的にA述べているので、この結果は驚くべきことではありません。

または、次のデフォルトを指定しますx

class A
{
    int x;
public:
    A(int x = 1) : x(x) {}
};

これをデフォルトのコンストラクタにします。

于 2012-07-05T16:04:08.890 に答える
2

2番目のデフォルトコンストラクターをAに追加します。

class A
{
    int x;
public:
    A(int x) : x(x) {}
    A() : x(1) {}
};
于 2012-07-05T16:05:18.953 に答える
2

はい、C ++ 11では、次のように書くことができます。

class B
{
    A a(1); //C++11 support this! (though the compilers may not, now)
public:
    B() {} //nothing here!
};

またはこれ、

    A a{1}; //using uniform initialization
于 2012-07-05T16:09:21.633 に答える
0

1つのコンストラクターを明示的に追加すると、デフォルトのコンストラクターは自動的に作成されないことに注意してください。これは唯一のデフォルトコンストラクタです。コピーコンストラクタが作成されます。

三つのルールも覚えておいてください。

三つのルール(ビッグスリーの法則またはビッグスリーとも呼ばれます)は、C ++の経験則であり、クラスが次のいずれかを定義する場合、おそらく3つすべてを明示的に定義する必要があると主張しています[1]。

destructor
copy constructor
copy assignment operator

>>

于 2012-07-05T16:12:46.960 に答える
0

これはすでにご存知だと思いますが、「a」をタイプAのオブジェクトへのポインターにすることができます。これにより、オブジェクトがインスタンス化されるタイミングを制御できるため、実行時にAコンストラクターに渡すことができる値を制御できます。 (明らかに削除が必要になります)

于 2012-07-05T16:20:52.660 に答える