У меня есть класс с именем polygon, который является моим базовым классом, в котором у меня есть площадь и периметр, и мне нужно извлечь класс прямоугольника из него. Прямо сейчас программа ниже не работает, и она дает мне следующую ошибку:
GS_Inheritance_Program.obj : error LNK2019: unresolved external symbol "public: virtual
__thiscall rectangle::~rectangle(void)" (??1rectangle@@UAE@XZ) referenced in function
"public: virtual void * __thiscall rectangle::`scalar deleting destructor'(unsigned int)"(??_Grectangle@@UAEPAXI@Z)
Это из-за деструкторов, которые я добавил в программу, но когда я удаляю их обоих, это работает.
Я провел некоторое исследование и выяснил, что это может быть связано с тем, что я неправильно компилировал файл .cpp программы. Это моя проблема? Если нет, то в чем моя проблема?
#include <iostream>
using namespace std;
class polygon
{
protected:
double area;
double perimeter;
public:
polygon(){}
~polygon();
double printperimeter();
double printarea();
};
double polygon::printperimeter()
{
return perimeter;
}
double polygon::printarea()
{
return area;
}
class rectangle:public polygon
{
protected:
double length;
double width;
public:
rectangle(double = 1.0, double = 1.0);
~rectangle();
double calcarea();
double calcperimeter();
};
rectangle::rectangle(double l, double w)
{
length = l;
width = w;
}
double rectangle::calcarea()
{
area = length*width;
return printarea();
}
double rectangle::calcperimeter()
{
perimeter = 2*(length+width);
return printperimeter();
}
void main()
{
rectangle rect_1 (9.0, 5.0);
cout<<"The Area of Rect_1 is " <<rect_1.calcarea() <<endl;
system("pause");
}
Вы объявили деструкторы в ваших классах. Но вы никогда не определяли их. Почему вы объявляете функции, а затем не определяете их? Вы объявили polygon::~polygon()
а также rectangle::~rectangle()
, Ни то, ни другое не определено.
Вы в основном врете компилятору. Вы делаете обещание, объявляя функцию, а затем нарушаете это обещание, не определяя ее. Отсюда и ошибка.
Постскриптум И это int main()
не void main()
,
Вы не добавили деструкторы. Вы сказали, что добавили их, но на самом деле вы их не добавили. Таким образом, компоновщик ищет их и не находит их.
Вы можете просто изменить:
~rectangle();
в
~rectangle() { ; }