通过引用传递对象到另一个类的构造函数时出错

时间:2018-05-25 14:18:32

标签: c++ class constructor

我有两个类,其中一个类有另一个类的对象作为数据成员,它的构造函数接受类对象来初始化数据成员对象。

class x{

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

class y{

 x temp;

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

但编译器在y :: y(x&amp;)中显示错误:没有匹配函数来调用x :: x()

我正在使用代码块16.01

2 个答案:

答案 0 :(得分:4)

您已定义构造函数:

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) {}

答案 1 :(得分:0)

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

不是C ++惯用语。

予。通常,您应该避免需要比所需更多的访问权限。在这里,您可能不会改变构造参数,因此您不需要通过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不是默认构造的,因此编译失败。