为什么这个构造函数调用另一个没有参数?

时间:2016-12-02 23:48:16

标签: c++ constructor

我试图创建两个简单的类,但是这段代码由于某种原因没有编译。它说我在没有参数的情况下调用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;
}

4 个答案:

答案 0 :(得分:2)

string_two_points(string type, point & xc):type(type){

此构造函数未初始化point y,因此通过调用默认的无参数构造函数point::point(不存在)来初始化默认值。

答案 1 :(得分:0)

string_two_points的构造函数都尝试为pointx调用y的默认构造函数,然后为它们分配一些内容。
它失败是因为point()不存在作为构造函数,正如编译器正确提到的那样。

答案 2 :(得分:0)

由于班级string_two_points的{​​{1}}成员名为pointxy的任何初始化都必须包含初始化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)
    {
    };
};