如何修复“对‘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<T>::value
的值将会不同。最好只删除或使用` = default;`。以上是关于如何修复“对‘Shape::Shape()’的未定义引用 - 在 C++ 中构建失败 3 个错误”的主要内容,如果未能解决你的问题,请参考以下文章