我有两个类,其中一个类有另一个类的对象作为数据成员,它的构造函数接受类对象来初始化数据成员对象。
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
答案 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 ©) { // 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
不是默认构造的,因此编译失败。