0

この場合、なぜデフォルトのコンストラクターを宣言する必要があるのか​​疑問に思います。一つには、私がそれを省略した場合、コンパイラはそれを自動的に行いませんか?それにもかかわらず、なぜそれが必要なのかはまだわかりません。また、「obj_B = origin.obj_B;」を省略しても、エラーが発生します。

class B
{
public:
    bool theArray[5] ;

    B(bool x) {theArray[1] = x;};
    //B(){};    
};

class A
{
public:
    B obj_B;

    A() : obj_B(1) {};
    A(A const &origin) {obj_B = origin.obj_B;}; //error:no matching function for call 
                                                      //to B::B()
}; 

int main () 
{
    std::vector <A> someAs;
    for(int q=0;q<10;q++)
        someAs.push_back(A());

    for(int q=0;q<10;q++)
        std::cout << someAs[q].obj_B.theArray[1] << std::endl;
}
4

4 に答える 4

6

代替コンストラクターを指定しない場合、コンパイラーはデフォルトのコンストラクターのみを作成します。

あなたが作ったので:

B(bool x) {theArray[1] = x;}

デフォルトのコンストラクターは作成されません。

発生する特定のエラーは、A(A const&origin)がobj_Bに使用するコンストラクターを明示的に指定していないためです。

次のコードが機能します。

A(A const &origin) : obj_B(1) {obj_B = origin.obj_B;}

ちなみに、関数定義の末尾にセミコロンは必要ありません。

于 2011-02-21T03:28:59.713 に答える
2

クラスにctorを定義しない場合、コンパイラーはデフォルトのコンストラクターを合成します。ただし、別のコンストラクター(たとえば、引数を取るコンストラクター)を定義する場合、コンパイラーはコンストラクターを合成しないため、自分でコンストラクターを定義する必要があります。

念のため、C++0xは「=default;」を追加します。別のctorを定義した場合でも、デフォルトで提供されるctorを提供するようにコンパイラーに指示する宣言。

于 2011-02-21T03:30:12.940 に答える
2

Aのデフォルトコンストラクタを必要としないコピーコンストラクタを定義するにはB、メンバー初期化構文を使用します。

class A {
public:
    A(A const& origin) : obj_B(origin.obj_B) {}
    //...
};
于 2011-02-21T03:36:45.250 に答える
0

最後にもう1つ...

デフォルト以外のコンストラクターを定義していなかったとすると、デフォルトのコンストラクターを定義しなかった場合、theArray[]の要素が未定義になります。これは、通常、バグにつながる悪い習慣です。

于 2011-02-21T04:32:35.963 に答える