首页 > 解决方案 > 在类主体之外定义函数时的c ++派生构造函数-“无默认构造函数”

问题描述

我正在通过 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;
};

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

标签: c++constructor

解决方案


该声明

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_eye,并且r_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没有默认构造函数(它似乎没有,否则您不会收到有关它的错误),那么这根本不可能。


推荐阅读