我正在练习 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_pt
和 radius_size
想象成内存中的位置,为您的类的每个实例存储这些值。当您创建一个类时,这些变量必须获得一些默认值,如果您没有指定任何内容,您将获得默认的构造值,无论这些值是什么。您可以稍后为这些位置赋值,但一些初始化总是会在类创建时发生。如果您使用初始化列表,您可以明确指定第一次放入内存的内容。
通过在此处使用成员初始值设定项列表,您的成员将在第一时间正确构建。它还具有节省一些不必要操作的好处。
关于c++ - 没有用于调用类构造函数的匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31211319/