没有用于调用Class Constructor的匹配函数

non*_*ble 12 c++ constructor class

我正在练习我的OOP,我有以下课程:Point和Circle.具体而言,Circle具有中心点和半径.这是相关代码:

// Point.h
class Point
{
    public:
        Point(double x, double y);
        double x() const;
        double y() const;
        std::string as_string() const;

    private:
        double x_coord;
        double y_coord;
};

// Circle.h
class Circle
{
    public:
        Circle(const Point& center, double radius);
        Point center() const;
        double radius() const;
        std::string as_string() const;
        std::string equation() const;

    private:
        Point center_pt;
        double radius_size;
};

// Circle.cpp
Circle::Circle(const Point& center, double radius)
{
    center_pt = center;
    radius_size = radius;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译此代码时,我收到以下错误:

Circle.cpp: In constructor ‘Circle::Circle(const Point&, double)’:
Circle.cpp:3: error: no matching function for call to ‘Point::Point()’
Point.h:10: note: candidates are: Point::Point(double, double)
Point.h:8: note:                 Point::Point(const Point&)
Run Code Online (Sandbox Code Playgroud)

我不知道如何解释这个错误.它是否告诉我需要在Circle构造函数中为Point参数提供x_coord和y_coord?

shu*_*e87 16

该成员center_pt正在默认初始化,并且此类操作将调用无参数默认构造函数Point().然而,这并没有在Point课程中定义,因此给你的错误.

Circle::Circle(const Point& center, double radius)
{
    center_pt = center; //<-- this is an assignment
                        //default init has already occurred BEFORE this point
    radius_size = radius;
}
Run Code Online (Sandbox Code Playgroud)

在分配到center_pt此处之前,您需要分配一些内容.因此,编译器会center_pt在尝试执行分配之前尝试默认初始化.

相反,如果使用成员初始值设定项列表,则可以避免出现默认构造的问题:

Circle::Circle(const Point& center, double radius):
    center_pt(center),
    radius_size(radius)
{
}
Run Code Online (Sandbox Code Playgroud)

当您创建一个类时,您实际上是将内存放在一边以存储该类中的各种成员.因此,想象center_pt并将radius_size内存中的值存储在类的每个实例中.当你创建一个类时,这些变量必须得到一些默认值,如果你没有指定任何东西,你得到默认的构造值,无论那些是什么.您可以稍后将值分配给这些位置,但在创建类时始终会进行一些初始化.如果使用初始化列表,则可以明确指定第一次在内存中放置的内容.

通过使用成员初始化列表,您的成员在第一次正确构建.它还具有节省一些不必要的操作的好处.


Vla*_*cow 6

按以下方式更改构造函数

Circle::Circle(const Point& center, double radius) 
    : center_pt( center ), radius_size( radius )  
{
}
Run Code Online (Sandbox Code Playgroud)

问题是如果你不Point打算用类的参数显式调用构造函数,那么编译器会尝试调用类的默认构造函数来创建center_pt类Circle的数据成员,然后才能在类的构造函数体内分配点Circle.但是您没有定义类的默认构造函数,Point并且编译器发出了错误.

另一种方法确实是为类定义默认构造函数Point,例如用零初始化一个点.

考虑到通过类的设计,Point您无法更改数据成员 coord_xcoord_y 创建的对象.也许您应该重新设计类.