我试图创建两个简单的类,但是这段代码由于某种原因没有编译。它说我在没有参数的情况下调用point :: point,但是我唯一一次调用point :: point是在main函数中,我在那里用参数调用它。
调试时,我发现它是string_two_points的构造函数,它正在调用点的构造函数。
#include <iostream>
#include <string>
using namespace std;
class point{
public:
int x;
int y;
point(int x, int y): x(x),y(y){};
point(const point & c): x(c.x), y(c.y) {};
};
class string_two_points{
public:
string type;
point x;
point y;
string_two_points(string type, point & xc):type(type){
x=xc;
};
string_two_points(string type, point & xc, point & yc):type(type){
x=xc;
y=yc;
};
};
int main(){
point a = point(2,3);
point b = point(3,4);
string_two_points x = string_two_points(string("abc"),a,b);
return 0;
}
答案 0 :(得分:2)
string_two_points(string type, point & xc):type(type){
此构造函数未初始化point y
,因此通过调用默认的无参数构造函数point::point
(不存在)来初始化默认值。
答案 1 :(得分:0)
string_two_points
的构造函数都尝试为point
和x
调用y
的默认构造函数,然后为它们分配一些内容。
它失败是因为point()
不存在作为构造函数,正如编译器正确提到的那样。
答案 2 :(得分:0)
由于班级string_two_points
的{{1}}成员名为point
,x
,y
的任何初始化都必须包含初始化string_two_points
和{ {1}}。由于您没有描述如何在构造函数的成员初始化列表中初始化它们,因此编译器会自动添加默认初始化,就像您已编写
x
注意y
不是初始化,它是在初始化完成后发生的赋值。
答案 3 :(得分:0)
由于string_two_points
有两个类型为point
的成员,并且在两个构造函数中都没有给出默认值,因此编译器需要初始化它们。为此,它尝试调用默认的无参数构造函数。由于这不存在,因此会产生错误。
您可以通过初始化每个构造函数中的成员来解决这个问题:
class string_two_points
{
public:
string type;
point x;
point y;
string_two_points(string type, point & xc)
: type(type), x(xc), y(0, 0)
{
};
string_two_points(string type, point& xc, point& yc)
: type(type), x(xc), y(yc)
{
};
};