c++ - X 类有多个默认构造函数和对重载函数的模棱两可的调用
问题描述
我了解错误对应的内容...我无法理解的是它们出现在我的代码中的方式。
错误消息:错误(活动)E0339 类“Point”有多个默认构造函数
错误 C2512 'Line':没有合适的默认构造函数可用
主文件
Point p1, p2;
Line line(p1, p2);
cout << "Point 1\n";
line.set_point1();
cout << "Point 2\n";
line.set_point2();
line.print();
源码.cpp
Point::Point() : x(0), y(0) { cout << "Point created\n"; }
Point::Point(double tx = 0, double ty = 0) : x(tx), y(ty) { cout << "Point created\n"; }
Point::Point(const Point& tobj) : x(tobj.x), y(tobj.y) { cout << "Point copied\n"; }
Point::~Point() { cout << "Point destroyed\n"; }
void Point::set_x() { cin >> x; }
void Point::set_y() { cin >> y; }
double Point::get_x() const { return x; }
double Point::get_y() const { return y; }
void Point::print() const { cout << "Point -- (" << x << " , " << y << ")\n"; }
Line::Line() { cout << "Line created\n"; } //CLASS "POINT" HAS MORE THAN ONE DEFAULT CONSTRUCTOR
Line::Line(const Point& tp1, const Point& tp2) : p1(tp1), p2(tp2) { cout << "Line created\n"; }
Line::Line(const Line& tobj) : p1(tobj.p1), p2(tobj.p2) { cout << "Line copied\n"; }
Line::~Line() { cout << "Line destroyed\n"; }
void Line::set_point1() { p1.set_x(); p1.set_y(); }
void Line::set_point2() { p2.set_x(); p2.set_y(); }
double Line::get_slope() { return ((p2.get_y() - p1.get_y()) / (p2.get_x() - p1.get_x())); }
void Line::print() { cout << "Point 1 == "; p1.print(); cout << "Point 2 == "; p2.print(); cout << "Slope == " << get_slope() << endl; }
头文件.h
class Point
{
double x, y;
public:
Point();
Point(double, double);
Point(const Point&);
~Point();
void set_x();
void set_y();
double get_x() const;
double get_y() const;
void print() const;
};
class Line
{
Point p1, p2;
public:
Line();
Line(const Point&, const Point&);
Line(const Line&);
~Line();
void set_point1();
void set_point2();
double get_slope();
void print();
};
当我删除Line::Line() { ... }
一切正常工作。主要问题是这样的:
1 - 为什么这一行会触发 POINT 类的错误消息。
2 - 为什么会触发“...多个默认构造函数”
3 - 为什么会触发“对重载函数的模糊调用”
我正在尝试创建Line
没有任何参数的对象,就像Line line;
解决方案
在 C++ 中,默认构造函数是可以不带参数调用的构造函数。这包括不带任何参数的构造函数或所有参数都是可选的构造函数。
您在这里有 2 个默认构造函数:
Point::Point()
Point::Point(double tx = 0, double ty = 0)
它们不仅在做同样的事情(因为第一个将成员设置为 0,就像第二个一样),而且它们会产生歧义。只需删除第一个构造函数,您的代码就会按预期工作。
推荐阅读
- mongodb - 在 mongodb 查询中按日期从 ISODate 分组
- git - Git:显示“假定未更改”文件
- python - 需要计算时间戳之间的时间差并将其存储在变量中
- amazon-web-services - AWS AppSync 响应排序结果?
- php - CodeIgniter 会话被破坏
- html - 我们可以在同一个 div 中使用 row 和 col-md-12 吗?还是应该在父子div中?
- r - R中的自动绘图功能和绘图功能有什么区别
- php - 问:ReactJS 的后端
- python - MNIST 数据非规范化并没有给我同样的回报
- c# - 当用户名不是电子邮件地址时,两因素身份验证不向电子邮件发送代码