конструкторы по умолчанию и копирование объектов - PullRequest
0 голосов
/ 21 февраля 2011

Мне интересно, почему мне нужно объявить конструктор по умолчанию в этом случае. Во-первых, разве компилятор не сделает это автоматически, если я его опущу? И, тем не менее, я до сих пор не понимаю, зачем это нужно. Кроме того, я получаю сообщение об ошибке, даже если я опускаю '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 ]

6 голосов
/ 21 февраля 2011

Компилятор создает конструктор по умолчанию, только если вы не указали альтернативный конструктор.

Потому что вы сделали:

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

Конструктор по умолчанию не будет создан для вас.

Конкретная ошибка, которую вы получаете, заключается в том, что A (const & origin) не указывает конструктор, который будет явно использоваться для obj_B.

Будет работать следующий код:

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

Кстати, вам не нужна конечная точка с запятой в определении функции.

2 голосов
/ 21 февраля 2011

Чтобы определить конструктор копирования для A, для которого не требуется конструктор по умолчанию для B, используйте синтаксис инициализатора элемента:

class A {
public:
    A(A const& origin) : obj_B(origin.obj_B) {}
    //...
};
2 голосов
/ 21 февраля 2011

Если вы не определили какие-либо ctors для класса, компилятор синтезирует конструктор по умолчанию. Если вы определяете другой конструктор (например, тот, который принимает аргумент), то компилятор не синтезирует один для вас, и вы должны определить его самостоятельно.

Если вам не все равно, C ++ 0x добавляет "= default;" объявление, указывающее компилятору предоставить ctor, который он предоставил бы по умолчанию, даже если вы определили другой ctor.

0 голосов
/ 21 февраля 2011

Чтобы сделать одну заключительную точку ...

Предполагая, что вы не определили конструктор не по умолчанию, невозможность определить конструктор по умолчанию привела бы к тому, что элементы theArray [] были бы неопределенными. Это плохая привычка, обычно приводящая к ошибкам в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...