我刚刚创建了一个"Point"类,并且正在开发一个"Line"类,它有两个Point对象(Point startpoint和Point端点)作为数据成员.我在我的Line类中创建了一个构造函数,它接受两个Point对象作为参数,并且最初创建它如下:
Line(const Point& p1, const Point& p2)
{
startpoint = p1;
endpoint = p2;
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,但后来我决定使用成员初始化列表,而不是将成员分配给正文中的p1和p2,只是因为...但是当我将其更改为:
Line(const Point& p1, const Point& p2): startpoint(p1), endpoint(p2)
{
}
Run Code Online (Sandbox Code Playgroud)
我得到一个错误说"没有构造函数的实例"Point :: Point"匹配参数列表"并且不明白这意味着什么.
为什么成员初始化列表不在这里工作?
谢谢.
编辑:对不起,我不知道我的积分课的细节是否相关:
// Point.h
class Point
{
private:
double x;
double y;
public:
Point();
Point(Point& p);
Point(double x1, double y1);
~Point();
double X() const;
double Y() const;
void X(double newx);
void Y(double newy);
};
Run Code Online (Sandbox Code Playgroud)
// Point.cpp
#include "Point.h"
Point::Point(): x(0), y(0)
{
}
Point::Point(Point& p)
{
x = p.x;
y = p.y;
}
Point::Point(double x1, double y1): x(x1), y(y1)
{
}
Point::~Point()
{
}
double Point::X() const
{
return x;
}
double Point::Y() const
{
return y;
}
void Point::X(double newx)
{
x = newx;
}
void Point::Y(double newy)
{
y = newy;
}
Run Code Online (Sandbox Code Playgroud)
Use*_*ess 10
成员初始化取决于Point具有公共拷贝构造函数,因为您显式调用Point::Point(const Point&).
如果它不存在或无法访问,则无法调用它.如果你不能调用它,那不是因为初始化列表不起作用.
Point如果第一个版本有效,可能会有一个可访问的赋值运算符.
只是为了确认,现在你已经粘贴了源代码Point,复制构造函数应该如下所示:
Point::Point(const Point &other) : x(other.x), y(other.y) {}
Run Code Online (Sandbox Code Playgroud)
(您可能也习惯使用初始化列表).关键的变化是参数必须是一个const引用:这禁止在复制时意外损坏源对象.