调用类构造函数没有匹配的函数

新手上路,请多包涵

我正在练习我的 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;
}

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

 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?

原文由 nonremovable 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

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

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

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

通过在此处使用成员初始化器列表,您的成员第一次就被适当地构造了。它还具有节省一些不必要的操作的好处。

原文由 shuttle87 发布,翻译遵循 CC BY-SA 3.0 许可协议

在尝试构造 Circle 时,您尝试使用默认构造函数 构造 一个 Point:

 Circle::Circle(const Point& center, double radius)
                     ^
                //...Calling default constructor...

…然后为其 分配 一个值:

 center_pt = center;

鉴于默认构造函数不存在,您会收到编译时错误。

两种解决方案是:

1) 使用成员初始化列表构造一个点:

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

2) 为Point定义一个默认构造函数:

 Point::Point(){

}

我主要回答这个问题是为了 强调 选项 2,因为我认为上述答案中缺乏这种 _强调_。有时,在给定的类参数列表中默认构造一个对象并在稍后阶段为其分配一个值更为实用。在使用 Qt 框架的 GUI 编程中会遇到一些情况。

原文由 Dean P 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题