设计面向对象c++多边形基类CPolygon及其派生类CTriangle、CRectangel和CCircle类
设计多边形基类CPolygon及其派生类CTriangle、CRectangel和CCircle类,为各个类设计虚函数Input()、Area()、Print(),实现从数据文件读入数据,从而生成各种多边形对象,并且计算面积和输出对象信息,数据文件格式如下(左):每一行存储一个对象,第一单词位对象类型,其后是数据,具体实例(右):
TRIANGLE 底边长 高 TRIANGLE 30 5
RECTANGLE 长 宽 RECTANGLE 12 7
CIRCLE 半径 CIRCLE 27
要求采用STL中的vector来存储基类指针来指向各个对象,并用循环实现各形状对象的操作。
话不多说,代码如下:
int main()
{
FILE *stream;
stream=fopen("xx.txt","r");
if(stream==NULL)
{
cout<<"文件打开失败 "<<endl;
return 0;
}
CPolygon *POL[3];//定义对象指针数组,包含三个指针变量元素
char sbuf[100];//字符缓冲区
int i=0;//序号
while(fgets(sbuf,100,stream)!=NULL&&i<10)//读入一行字符串
{
if(strncmp(sbuf,"CIRCLE",6)==0)//检验是否为circle类型
POL[i]=new CCircle();//是,动态生成circle对象
else if(strncmp(sbuf,"TRIANGLE",1)==0)
POL[i]=new CTriangle();
else if(strncmp(sbuf,"RECTANGLE",0)==0)
POL[i]=new CRectangle();
else break;//其他非法信息
POL[i]->Input(stream);//用基类指针调用input虚函数
i++;//序号递增
}
fclose(stream);//关闭文件
for(int j=0;j<i;j++)
{
POL[j]->Show();//用基类指针调用show虚函数
cout<<endl;
delete POL[j];//删除对象
}
return 0;
}
//定义图形抽象基类
{
protected:
string Name;
int Long;
int Width;
public:
CPolygon()//构造函数
{
Name="CPolygon";
Long=0;
Width=0;
}
virtual ~CPolygon(){}//虚析构函数
//静态函数TrimLine(),用于整理字符串,去掉串尾部换行字符
static void TrimLine(char *sbuf)
{
while(sbuf!='\0')
{
if(*sbuf=='\r'||*sbuf=='\n')
{
*sbuf='\0';
break;
}
sbuf++;
}
}
virtual bool Input(FILE *fp)=0;//纯虚函数input,输入数据
virtual double Area()=0;//求面积
virtual void Show()=0;//输出信息
};
class CCircle:public CPolygon
{
public:
CCircle()//构造函数
{
Name="CIRCLE";
}
//重写虚函数input
bool Input(FILE *fp)//FILE *fp是声明,声明fp是指针,用来指向FILE文件
{
char sbuf[100];
fgets(sbuf,100,fp);//读入一行字符串(包括换行符)
TrimLine(sbuf);//去掉换行符
Long=atoi(sbuf);//把字符串内容转换为整数
return true;
}
double Area()
{
double Area;
return Area=PI*Long*Long;
}
void Show()
{
cout<<"多边形为:"<<Name<<endl;
cout<<"半径为:"<<Long<<endl;
cout<<"面积为:"<<Area()<<endl;
}
};
class CTriangle :public CCircle
{
public:
CTriangle()
{
Name="TRIANGLE";
}
bool Input(FILE *fp)
{
char sbuf[100];
CCircle::Input(fp);//代码重用,调用基类input函数
fgets(sbuf,100,fp);
TrimLine(sbuf);
Width=atoi(sbuf);
return true;
}
double Area()
{
double Area;
return Area=Long*Width/2;
}
void Show()
{
cout<<"多边形为:"<<Name<<endl;
cout<<"底边长为:"<<Long<<endl;
cout<<"高为:"<<Width<<endl;
cout<<"面积为:"<<Area()<<endl;
}
};
class CRectangle:public CTriangle
{
public:
CRectangle()
{
Name="RECTANGLE";
}
bool Input(FILE *fp)
{
char sbuf[100];
CTriangle::Input(fp);
return true;
}
double Area()
{
double Area;
return Area=Long*Width;
}
void Show()
{
cout<<"多边形为:"<<Name<<endl;
cout<<"边长为:"<<Long<<endl;
cout<<"宽为:"<<Width<<endl;
cout<<"面积为:"<<Area()<<endl;
}
};