面向对象c++多边形基类

设计面向对象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;
	}
};

项目在这。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值