如何修复“对‘Shape::Shape()’的未定义引用 - 在 C++ 中构建失败 3 个错误”

Posted

技术标签:

【中文标题】如何修复“对‘Shape::Shape()’的未定义引用 - 在 C++ 中构建失败 3 个错误”【英文标题】:how to fix "undefined reference to 'Shape::Shape()' - Build failed 3 error(s) in C++" 【发布时间】:2019-02-05 23:31:15 【问题描述】:

我正在学习 C++ OO 设计,但遇到了以下问题,我必须使用抽象类和继承。

我正在处理一个问题,我必须使用一个名为 Shape 的抽象类,它应该包含一个名为 get_area() 的虚函数,它返回一个 double

Circle 类继承 Shape 类并包含构造函数和成员函数:

Circle(double radius) double get_radius() void set_radius(double radius) double get_area()

Square 类继承 Shape 类并包含:

Square(double width) double get_width() void set_width(double width) double get_area()

Rectangle 类继承 Square 类并包含:

Rectangle(double width, double height) double get_height() void set_height(double width) double get_area()

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

class Shape 
    public:
        Shape();
        virtual double get_area() const = 0;
;

// Circle sub-class
class Circle : public Shape 
    private:
        double r;
    public:
        Circle(double radius) : Shape() 
            r = radius;
        
        void set_radius(double radius) 
            r = radius;
        
        double get_radius() 
            return r;
        

        virtual double get_area() const 
            return 3.14159 * pow(r, 2);
        
;

// Square sub-class
class Square : public Shape 
    protected:
        double w;
    public:
        Square(double width) : Shape() 
            w = width;
        

        void set_width(double width) 
            w = width;
        

        double get_width() const 
            return w;
        

        virtual double get_area() const 
            return w * w;
        
;

/*
// Rectangle sub-class
class Rectangle : public Shape, public Square 
    private:
        double h, w;
    public:
        Rectangle(double width, double height) : Shape()
            h = height;
            w = width;
        

        void set_heigth(double height) 
            h = height;
        

        void set_width(double width) 
            w = width;
        

        double get_height() const 
            return h;
        

        double get_width() const 
            return w;
        

        virtual double get_area() const 
            return h * w;
        
;

*/

// -------------------------------------------------------------------
int main() 
    Circle c(5.5);
    cout << "\t" << c.get_radius() << endl;

    //Rectangle r(4.2, 2.5);
    //cout << "\t" << r.get_width() << " " << r.get_height() << endl;

    return 0;

实际在做什么:

对 'Shape::Shape() 的未定义引用

Rectangle 类也抛出错误,这就是它被注释掉的原因

应该怎么做:我应该能够从这些类中的任何一个创建一个名为Circle c 的对象,并通过输入半径来获取面积。

【问题讨论】:

Shape::Shape的定义在哪里?我只能看到它的声明。 您不应该在Rectangle 上使用多重继承,它已经从Square 继承了Shape,因此无需再次指定Shape。此外,正方形是一种特殊类型的矩形,但矩形不是正方形,因此您的 Square 类应该派生自 Rectangle,而不是相反。 Square构造函数可以调用Rectangle构造函数传递width作为height,然后你就可以摆脱Square中的所有成员 【参考方案1】:

这与您的继承、抽象类或 OO 设计无关。问题是,您已经声明了Shape::Shape,即构造函数,但没有定义。所以链接器抱怨它找不到构造函数的代码。

尝试只删除Shape的构造函数,看起来你不需要它。

【讨论】:

或者提供内联实现:class Shape public: Shape() ... ; @RemyLebeau 如果你这样做,std::is_trivial&lt;T&gt;::value 的值将会不同。最好只删除或使用` = default;`。

以上是关于如何修复“对‘Shape::Shape()’的未定义引用 - 在 C++ 中构建失败 3 个错误”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞

如何在DOS环境下修复系统