我正在练习我的 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 许可协议
成员
center_pt
正在被默认初始化,这样的操作将调用无参数默认构造函数Point()
。然而,这并没有在Point
类中定义,因此会给你你得到的错误。在您可以分配给
center_pt
之前,您需要分配一些东西。因此,编译器会尝试在尝试执行分配之前首先为您默认初始化center_pt
。相反,如果您使用 成员初始值设定项列表,您可以避免默认构造后跟赋值的问题:
当您创建一个类时,您实际上是在留出内存来存储该类中的各种成员。因此,想象
center_pt
和radius_size
作为每个类实例存储这些值的内存位置。当你创建一个类时,这些变量必须得到一些默认值,如果你没有指定任何东西,你会得到默认的构造值,不管它们是什么。您可以稍后将值分配给这些位置,但在创建类时总是会发生一些初始化。如果您使用初始化列表,您可以明确指定第一次放置在内存中的内容。通过在此处使用成员初始化器列表,您的成员第一次就被适当地构造了。它还具有节省一些不必要的操作的好处。