运行测试程序时收到以下错误:
如果我注释掉“删除名称”,错误就会消失,但我似乎无法弄明白为什么。希望有人可以让我深入了解解决方案。
#include<iostream>
#include<string>
using namespace std;
class Shape
{
protected:
string* name = new string;
public:
Shape(string str)
{
*name = str;
}
~Shape()
{
delete name; //Why does my program run if I comment this out?
name = NULL;
}
virtual double getArea() const
{ return 0; }
void setName(string str)
{ *name = str; }
string getName() const
{ return *name; }
};
class Circle : public Shape
{
private:
double radius;
public:
Circle(string str = "", double r = 0) : Shape(str)
{ radius = r; }
void setRadius(double r)
{ radius = r; }
double getRadius() const
{ return radius; }
virtual double getArea() const
{ return radius * radius * 3.14; }
Circle operator= (const Circle &);
Circle operator+ (const Circle &);
};
Circle Circle::operator= (const Circle &right)
{
radius = right.radius;
return *this;
}
Circle Circle::operator+ (const Circle &right)
{
Circle tempCircle;
tempCircle.radius = radius + right.radius;
return tempCircle;
}
int main()
{
Circle c1("c1",5);
Circle c2("c2",10);
Circle c3;
c3 = c2 + c1;
cout << "c1" << c1.getRadius() << endl;
cout << "c2" << c2.getRadius() << endl;
cout << "c3" << c3.getRadius() << endl;
return 0;
}
答案 0 :(得分:2)
使用时使用编译器定义的复制构造函数:
c3 = c2 + c1;
当您拥有从堆分配并在析构函数中释放的成员数据时,这是一个问题。
为您的班级添加适当的副本构造函数。
有关详细信息,请参阅The Rule of Three。
您可以通过更改
来消除对用户定义的复制构造函数和复制赋值运算符的需求string* name = new string;
到
string name;
并更改代码的其余部分。