gpt4 book ai didi

在类主体之外定义函数时的 C++ 派生构造函数 - "no default constructor"

转载 作者:行者123 更新时间:2023-12-03 07:00:30 24 4
gpt4 key购买 nike

我正在通过 Bjarne Stroustrup 的《编程原理》一书独自工作,并且在定义构造函数时遇到了麻烦。这个问题需要使用从 FLTK 图形库构建的界面;一般不用担心那里。我们必须从没有默认构造函数的 circle 类中创建一个笑脸——常规构造函数接受一个 (x,y) 点和一个半径。我希望能够进行一些计算/做其他事情 - 所以试图在类主体之外为我的笑脸定义构造函数。这不起作用,并且我不断收到错误(来自 Visual Studio)“类“Graph_lib::Circle”不存在默认构造函数。

struct Smiley :public Circle {
Smiley(Point p, int rr);
void draw_lines() const;
void sc(Color c);

Circle l_eye;
Circle r_eye;
};

Smiley::Smiley(Point p, int rr) {
Circle(p, rr);
Circle l_eye(Point(p.x - 50, p.y - 50), rr / 8);
Circle r_eye(Point(p.x + 50, p.y - 50), rr / 8);
}
基本上,上面的行不通。我认为它出于某种原因试图以某种方式创建一个默认的 Circle,但是找不到它的默认函数(因为我还没有写过)然后抛出错误。我已经为这个函数尝试了很多不同的组合,但似乎无法让它不尝试并调整默认值。请注意,如果我在 Smiley::Smiley 中去掉 l_eye 和 r_eye 之前的“Circle”类型 - 它仍然会引发“调用没有适当 operator() 的类类型对象或将函数转换为指针的错误” -功能类型”。
但是,如果我只是在初始化列表中定义它,它就可以正常工作。
struct Smiley :public Circle {
Smiley(Point p, int rr) : Circle(p, rr), l_eye(Point(p.x - 50, p.y - 50), rr/8), r_eye(Point(p.x + 50, p.y - 50), rr/8) {}
void draw_lines() const;
void sc(Color c);

Circle l_eye;
Circle r_eye;
};
显然,这是一个非常微不足道的例子。但是,我认为获得这个对我来说很重要,因为将来会有很多次我需要在外部构造函数中实际进行计算。如果有人可以帮助解释问题所在,那就太好了。

最佳答案

该声明

Circle(p, rr);
创建一个临时 Circle对象,未使用。
然后
Circle l_eye(Point(p.x - 50, p.y - 50), rr / 8);
Circle r_eye(Point(p.x + 50, p.y - 50), rr / 8);
正在创建两个新的对象和变量,与您的同名成员变量完全无关。
您得到的错误是因为编译器需要初始化(构造)基类和成员变量 l_eyer_eye ,作为 Smiley 的一部分构造,并且此初始化在 Smiley 之前完成构造函数体被调用。

在某种程度上,您的构造函数:
Smiley::Smiley(Point p, int rr) {
Circle(p, rr);
Circle l_eye(Point(p.x - 50, p.y - 50), rr / 8);
Circle r_eye(Point(p.x + 50, p.y - 50), rr / 8);
}
相当于:
Smiley::Smiley(Point p, int rr)
: Circle(), l_eye(), r_eye() // Default initialization
{
Circle(p, rr);
Circle l_eye(Point(p.x - 50, p.y - 50), rr / 8);
Circle r_eye(Point(p.x + 50, p.y - 50), rr / 8);
}
如果 Circle没有默认构造函数(它似乎没有,否则你不会得到关于它的错误),那么这根本不可能。

关于在类主体之外定义函数时的 C++ 派生构造函数 - "no default constructor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64440799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com