这是我的代码。我需要帮助使这个动态绑定工作。
#include<iostream>
#include<conio.h>
using namespace std;
class Shape {
protected:
double x,y;
public:
void get_data(double a,double b=3.14) {
x=a;
y=b;
}
virtual void display_area(){
};
};
class Rectangle : public Shape {
public:
void display_area() {
cout<<"\nArea of Rectangle : "<<x*y<<" units.\n";
}
};
class Circle : public Shape {
public:
void display_area() {
cout<<"\nArea of Circle : "<<y*x*x<<" units.\n";
}
};
class Triangle : public Shape {
public:
void display_area() {
cout<<"\nArea of Triangle : "<<0.5*x*y<<" units.\n";
}
};
main() {
Shape *ptr;
char opt,wait;
double a,b;
do{
system("cls");
cout<<"\n1.Area of Rectangle\n2.Area of Circle\n3.Area of Triangle\n4.Exit\n\nEnter your Option : ";
opt=getche();
switch(opt) {
case '1':
*ptr = new Rectangle;
cout<<"\nEnter Length : ";
cin>>a;
cout<<"\nEnter Width : ";
cin>>b;
ptr->get_data(a,b);
ptr->display_area();
break;
case '2':
*ptr = new Circle;
cout<<"\nEnter Radius : ";
cin>>a;
ptr->get_data(a);
ptr->display_area();
break;
case '3':
*ptr = new Triangle;
cout<<"\nEnter Base : ";
cin>>a;
cout<<"\nEnter Height : ";
cin>>b;
ptr->get_data(a,b);
ptr->display_area();
break;
case '4':
cout<<"\n\nGoodBye ! Have a Nice Day !\n";
exit(0);
default:
cout<<"\n\nEnter a Valid Option !\n";
}
cout<<"\n\nPress Any Key to Continue....";
wait=getche();
}while(opt!='4');
}
我得到的错误是
5 7 [Note] Shape& Shape::operator=(const Shape&)
5 7 [Note] no known conversion for argument 1 from 'Rectangle*' to 'const Shape&'
55 10 [Error] no match for 'operator=' (operand types are 'Shape' and 'Circle*')
55 10 [Note] candidate is:
5 7 [Note] Shape& Shape::operator=(const Shape&)
5 7 [Note] no known conversion for argument 1 from 'Circle*' to 'const Shape&'
62 10 [Error] no match for 'operator=' (operand types are 'Shape' and 'Triangle*')
62 10 [Note] candidate is:
5 7 [Note] Shape& Shape::operator=(const Shape&)
5 7 [Note] no known conversion for argument 1 from 'Triangle*' to 'const Shape&'
你正在分配 ptr
不正确。当你将一个对象分配给它时,你不应该对它进行减引用。
改变这个
*ptr = ...;
对此
ptr = ...;
同时,你也泄露了你用 new
. 你要打电话 delete ptr;
当你使用完每个对象时。这也就意味着你需要给 Shape
以便正确调用正确的子代析构器。
class Shape {
...
public:
virtual ~Shape() {}
...
};
我想补充一下 不要使用原始指针.如果你使用了智能庞特。std::unique_ptr 那么你就可以避免错误。而且你不需要考虑删除对象。
std::unique_ptr<Shape> ptr;
ptr = std::make_unique<Rectangle>();