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内存中的值存储在类的每个实例中.当你创建一个类时,这些变量必须得到一些默认值,如果你没有指定任何东西,你得到默认的构造值,无论那些是什么.您可以稍后将值分配给这些位置,但在创建类时始终会进行一些初始化.如果使用初始化列表,则可以明确指定第一次在内存中放置的内容.
通过使用成员初始化列表,您的成员在第一次正确构建.它还具有节省一些不必要的操作的好处.
按以下方式更改构造函数
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_x和coord_y 创建的对象.也许您应该重新设计类.