C++ 我能';我不明白析构函数出了什么问题?
我有一个名为polygon的类,它是我的基类,其中有面积和周长,我需要从中派生一个矩形类。现在,下面的程序不工作,它给了我以下错误:C++ 我能';我不明白析构函数出了什么问题?,c++,constructor,virtual-destructor,C++,Constructor,Virtual Destructor,我有一个名为polygon的类,它是我的基类,其中有面积和周长,我需要从中派生一个矩形类。现在,下面的程序不工作,它给了我以下错误: GS_Inheritance_Program.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall rectangle::~rectangle(void)" (??1rectangle@@UAE@XZ) referenced in function "public
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");
}
#包括
使用名称空间std;
类多边形
{
受保护的:
双区;
双周长;
公众:
多边形(){}
~polygon();
双重打印周长();
双重打印区域();
};
双多边形::打印周长()
{
返回周长;
}
双多边形::printarea()
{
返回区;
}
类矩形:公共多边形
{
受保护的:
双倍长度;
双倍宽度;
公众:
矩形(双精度=1.0,双精度=1.0);
~rectangle();
双距();
双calcperimeter();
};
矩形::矩形(双l,双w)
{
长度=l;
宽度=w;
}
双矩形::calcarea()
{
面积=长度*宽度;
返回打印区域();
}
双矩形::CalcPrimeter()
{
周长=2*(长度+宽度);
返回printpermiture();
}
void main()
{
矩形矩形矩形1(9.0,5.0);
cout您没有添加析构函数。您说您添加了析构函数,但实际上没有添加。因此链接器正在查找它们,但没有找到它们
你可以改变一下:
~rectangle();
到
您在类中声明了析构函数。但您从未定义过它们。为什么您要声明函数,然后却无法定义它们?您声明了polygon::~polygon()
和rectangle::~rectangle()
。但这两个函数都没有定义
你基本上是在对编译器撒谎。你通过声明一个函数来做出承诺,然后由于没有定义它而违背了承诺。因此出现了错误
P.S.和<代码> int main()/<代码>,而不是<代码>空格main()/< > > /< p>除非您没有包含所有代码,否则声明析构函数,但绝不给它们提供体。在C++中,必须使用<代码> int main(空隙)< /C> >或<代码> int main(int ARCC,char *ARGV)
;返回类型为void
是无效的选项。分号在第二个矩形代码中是任意的,请忽略它。另外,请参阅Sutter/Alexendrescu的“C++编码标准”第50项关于虚拟析构函数:“规则应该是使基类析构函数在且仅当它们是公共的时候才是虚拟的”因此,您的多边形
应该有一个virtual~polygon(){}
声明。
~rectangle() { ; }