c++ - 没有用于调用类构造函数的匹配函数

标签 c++ class constructor

我正在练习 OOP,我有以下类(class):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;
}

但是,当我尝试编译这段代码时,出现以下错误:

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&)

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

最佳答案

成员 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;
}

在您可以分配给 center_pt 之前,您需要分配一些东西。因此,编译器会在尝试执行赋值之前首先尝试为您默认初始化 center_pt

相反,如果您使用 member initializer list你可以避免默认构造后赋值的问题:

Circle::Circle(const Point& center, double radius):
    center_pt(center),
    radius_size(radius)
{
}

当您创建一个类时,您实际上是在留出内存来存储该类中的各种成员。因此,将 center_ptradius_size 想象成内存中的位置,为您的类的每个实例存储这些值。当您创建一个类时,这些变量必须获得一些默认值,如果您没有指定任何内容,您将获得默认的构造值,无论这些值是什么。您可以稍后为这些位置赋值,但一些初始化总是会在类创建时发生。如果您使用初始化列表,您可以明确指定第一次放入内存的内容。

通过在此处使用成员初始值设定项列表,您的成员将在第一时间正确构建。它还具有节省一些不必要操作的好处。

关于c++ - 没有用于调用类构造函数的匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31211319/

相关文章:

c++ - WinINet InternetGetProxyInfo : error 1003 ERROR_CAN_NOT_COMPLETE

c++ - 创建 "shortcuts"类宏定义

c++ - 直接和复制构造函数

c++ - constexpr 构造函数中不能使用 constexpr 构造函数

c++ - 如何将位序列放入字节(C/C++)

C++ 从 int 到 long 的转换是一种提升吗?

for 循环中的 C++ 11 线程类成员函数给出段错误

java - 接口(interface)方法的使用(Java)?

constructor - Kotlin:为什么构造函数参数默认具有 "internal"可见性?

Groovy 枚举构造函数匹配