C++ primer plus第六版课后编程题答案13.2


Cd2.cpp

#include <iostream>
#include <cctype>
using namespace std;

class Cd{

private:
	char *performers;
	char *label;
	int selections;
	double playtime;
public:
	char *perfor(){return performers;};
	char *lab(){return label;};
	int sel(){return selections;};
	double play(){return playtime;};
	//为了Classic的=
	void setPer(char *p){ 
		int len=strlen(p);
		delete[]performers;//要先释放原来的
		performers=new char[len+1];
		strcpy(performers,p);
	};
	void setlab(char *l){
		
		int len=strlen(l);
		delete[]label;
		label=new char[len+1];
		strcpy(label,l);
	};
	void setsel(int num){selections=num;};
	void setplay(double s){playtime=s;};
	//
	Cd(char *s1,char *s2,int n,double x)
	{
		int lens1=strlen(s1);
		int lens2=strlen(s2);

		performers=new char[lens1+1];
		strcpy(performers,s1);

		label=new char[lens2+1];
		strcpy(label,s2);

		selections=n;
		playtime=x;
	}/*
	Cd(const Cd &d)
	{
		strcpy(performers,d.performers);
		strcpy(label,d.label);
		selections=d.selections;
		playtime=d.playtime;
	}*/
	Cd(){}
	virtual ~Cd(){
		delete[]performers;
		delete[]label;
	}//构造函数应为虚函数
	virtual void Report()const
	{
		cout<<"performers:"<<performers<<endl;
		cout<<"label:"<<label<<endl;
		cout<<"selection:"<<selections<<"   playtime:"<<playtime<<endl;
		//cout<<endl;
	}
	virtual Cd&operator=(const Cd &d)
	{
		return Cd(d);
	}
};
class Classic:public  Cd
{
private:
	char *mainLabel;
public:
	Classic(char *s1,char *s2,char *s3,int n,double x):Cd(s1,s2,n,x)
	{
		int len=strlen(s3);
		mainLabel=new char[len+1];
		strcpy(mainLabel,s3);
	}
	Classic(Classic &c):Cd(c.perfor(),c.lab(),c.sel(),c.play())//不能使用const
	{
		int len=strlen(c.mainLabel);
		mainLabel=new char[len+1];
		strcpy(mainLabel,c.mainLabel);
	}
	Classic(){
	}
	virtual ~Classic(){
	delete[]mainLabel;
	}
	virtual void Report()const
	{
		Cd::Report();//原来是这样子调用父类的方法的啊
		cout<<"mainLabel:"<<mainLabel;
		cout<<endl;
	}
	/*
	Classic &operator=(Classic &c)//不能使用const
	{
		return Classic(c);
	}*/
	void operator=(Classic &c)//不能使用const
	{
		//strcpy(performers,c.perfor());
		Cd::setPer(c.perfor());
		Cd::setlab(c.lab());
		Cd::setsel(c.sel());
		Cd::setplay(c.play());
		//strcpy(mainLabel,c.mainLabel);
		int len=strlen(c.mainLabel);
		delete []mainLabel;
		mainLabel=new char[len+1];
		strcpy(mainLabel,c.mainLabel);
	}


};

main132.cpp

#include <iostream>
#include "Cd2.cpp"
using namespace std;

void Bravo(const Cd &d)
{
	d.Report();
};
void main132()
{
	Cd c1("Beates","Capitol",14,35.5);
	Classic c2=Classic("Piano Sonata in B flag,Fantasia in C","Alfred Brendel","Philips",2,59.19);
	Cd *pcd=&c1;

	cout<<"Using object directly:"<<endl;
	c1.Report();
	cout<<endl;
	c2.Report();

	cout<<"Using type cd * pointer to object:"<<endl;
	pcd->Report();
	cout<<endl;
	pcd=&c2;//重定位pcd
	pcd->Report();

	cout<<"Calling a funciton with a Cd reference argument:"<<endl;

	Bravo(c1);
	Bravo(c2);

	cout<<"Testing assignment:"<<endl;
	//Classic copy=c2;//这样也是可以的
	//Classic copy(c2);//这样就没问题,那就是赋值出了问题
	Classic copy; //因为这里已经初始化了,所以copy已经是利用Classic()初始化了
	copy=c2;//这里有问题、//这样的话,这样赋值就不能返回一个Classic的值了
	copy.Report();
	cin.get();
	


}

 

 


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注