Ошибка при передаче объекта по ссылке на конструктор другого класса - PullRequest
0 голосов
/ 25 мая 2018

У меня есть два класса, один из которых имеет объект другого класса в качестве члена данных, и его конструктор принимает объект класса для инициализации объекта члена данных.

class x{

public:
    x(int a, int b)
     { cout << a << b;}
  };

class y{

 x temp;

 y(x& o){ this-> temp = o;}
 };

Но компилятор показывает ошибку в y:: y (x &): нет соответствующей функции для вызова x :: x ()

Я использую кодовые блоки 16.01

Ответы [ 2 ]

0 голосов
/ 25 мая 2018
y(x& o){ this-> temp = o; }

не очень идиоматичен для C ++.

I.Как правило, вам следует избегать требовать больше прав доступа, чем необходимо.Здесь вы, скорее всего, не мутируете аргумент конструкции, поэтому вам не нужно передавать его как mutable reference:

y(x const &o);

II.Инициализация членов в C ++ выполняется совсем по-другому:

y(x const &o): temp(o) {}

Когда вы пишете

y(x const &o) { temp = o; } // please avoid writing `this->'

, то происходит следующее: сначала создается temp и инициализируется по умолчанию (дооткрывающая скобка);затем, внутри фигурных скобок, temp уже является допустимым объектом, поэтому далее следует присвоение копии.В вашем случае x не является конструируемым по умолчанию, поэтому компиляция не удалась.

0 голосов
/ 25 мая 2018

Вы определили конструктор:

x(int a, int b)

в x.Это означает, что компилятор больше не будет определять никаких конструкторов для вас, в том числе и конструктор x().Таким образом, вы можете только построить x с x(int, int).Вот в вашем коде:

 x temp;
 y(x& o) { // < No initializer list

Вы пытаетесь построить по умолчанию x, но x не имеет конструктора по умолчанию!Либо определите его, либо создайте x в списке инициализатора с указанным конструктором.

Например:

y(x& o) : x(0, 0) {

Но вы создадите свой объект, тогда вы будете использовать неявноопределил copy-assignment оператор для его назначения, что является пустой тратой времени.Вы действительно можете решить все эти проблемы, используя copy-constructor:

 class x{
    ...
    x(const x &copy) { // Define a copy constructor or just use 
                       // the implicitly defined one.

Затем в y, просто используйте его в списке инициализаторов y:

 x temp;
 y(x& o) : temp(o) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...