1. 程式人生 > >C++primer plus第六版課後程式設計練習答案13.3

C++primer plus第六版課後程式設計練習答案13.3

#ifndef DMA_H_
#define DMA_H_
#include <iostream>

class DMA
{
private:
	char *label;
	int rating;
protected:
	void setlab(const char *c);
	void dellab();
	void setrat(const int n);
	char *getlab()const{return label;}
	int getrat()const{return rating;}
public:
	DMA(const char *l="null",int r=0);
	DMA(const DMA &rs);
//	DMA(){label=NULL;rating=0;}//warning C4520: 'DMA' : multiple default constructors specified,預設建構函式有兩個,當DMA d時,這兩個建構函式可以不帶引數呼叫(即兩者都是預設的建構函式)。 
	virtual ~DMA();
	virtual DMA &operator=(const DMA &rs);
	friend std::ostream &operator<<(std::ostream &os,const DMA &rs);
	virtual void View();
};

class baseDMA:public DMA
{
public:
	baseDMA(const char *l="null",int r=0);
	baseDMA(const baseDMA &rs);
//	virtual ~baseDMA();
	baseDMA &operator=(const baseDMA &rs);
	virtual void View();
	friend std::ostream &operator<<(std::ostream &os,const baseDMA &rs);
};

class lacksDMA:public DMA
{
private:
	enum{COL_LEN=40};
	char color[COL_LEN];
public:
	lacksDMA(const char *c="blank",const char *l="null",int r=0);
	lacksDMA(const char *c,const DMA &rs);
	virtual void View();
	friend std::ostream &operator<<(std::ostream &os,const lacksDMA &rs);
};

class hasDMA:public DMA
{
private:
	char *style;
protected:
	char *getsty()const{return style;}
	void setsty(const char *c);
	void delsty();
public:
	hasDMA(const char *s="null",const char *l="null",int r=0);
	hasDMA(const char *s,const DMA &rs);
	hasDMA(const hasDMA &hs);
	~hasDMA();
	hasDMA &operator=(const hasDMA &rs);
	virtual void View();
	friend std::ostream & operator<<(std::ostream &os,const hasDMA &rs);
};

#endif
#include <iostream>
#include "dma.h"

using namespace std;

void DMA::setlab(const char *c)
{
	label=new char[strlen(c)+1];
	strcpy(label,c);
}

void DMA::dellab()
{
	delete [] label;
	label=NULL;
}

void DMA::setrat(const int n)
{
	rating=n;
}

DMA::DMA(const char *l,int r)
{
	setlab(l);
	setrat(r);
}

DMA::DMA(const DMA &rs)
{
	setlab(rs.getlab());
	setrat(rs.getrat());
}

DMA::~DMA()
{
	delete [] label;
	label=NULL;
}

DMA &DMA::operator=(const DMA &rs)
{
	dellab();
	setlab(rs.getlab());
	setrat(rs.getrat());

	return *this;
}

void DMA::View()
{
	cout<<"label="<<label<<endl;
	cout<<"rating="<<rating<<endl;
}

ostream &operator<<(ostream &os,const DMA &rs)
{
	os<<"label="<<rs.label<<endl;
	os<<"rating="<<rs.rating<<endl;
	return os;
}
//void DMA::View();

baseDMA::baseDMA(const char *l,int r):DMA(l,r){}

baseDMA::baseDMA(const baseDMA &rs):DMA(rs.getlab(),rs.getrat()){}
//	virtual ~baseDMA();
baseDMA & baseDMA::operator=(const baseDMA &rs)
{
	dellab();
	setlab(rs.getlab());
	setrat(rs.getrat());

	return *this;
}

void baseDMA::View()
{
	cout<<"baseDMA label="<<getlab()<<endl;
	cout<<"baseDMA rating="<<getrat()<<endl;
}

ostream &operator<<(ostream &os,const baseDMA &rs)
{
	os<<"baseDMA label="<<rs.getlab()<<endl;
	os<<"baseDMA rating="<<rs.getrat()<<endl;
	return os;
}


lacksDMA::lacksDMA(const char *c,const char *l,int r):DMA(l,r)
{
	strcpy(color,c);
}

lacksDMA::lacksDMA(const char *c,const DMA &rs):DMA(rs)
{
	strcpy(color,c);
}

void lacksDMA::View()
{
	cout<<"lacksDMA color="<<color<<endl;
	cout<<"lacksDMA label="<<getlab()<<endl;
	cout<<"lacksDMA rating="<<getrat()<<endl;
}

ostream &operator<<(ostream &os,const lacksDMA &rs)
{
	os<<"lacksDMA color="<<rs.color<<endl;
	os<<"lacksDMA label="<<rs.getlab()<<endl;
	os<<"lacksDMA rating="<<rs.getrat()<<endl;
	return os;
}

void hasDMA::setsty(const char *c)
{
	style=new char[strlen(c)+1];
	strcpy(style,c);
}

void hasDMA::delsty()
{
	delete [] style;
	style=NULL;
}

hasDMA::hasDMA(const char *s,const char *l,int r):DMA(l,r)
{
	setsty(s);
}

hasDMA::hasDMA(const char *s,const DMA &rs):DMA(rs)
{
	setsty(s);
}

hasDMA::hasDMA(const hasDMA &hs)
{
	setsty(hs.getsty());
	setlab(hs.getlab());
	setrat(hs.getrat());
}

hasDMA::~hasDMA()
{
	delsty();
}

hasDMA & hasDMA::operator=(const hasDMA &rs)
{
	delsty();
	dellab();
	setsty(rs.getsty());
	setlab(rs.getlab());
	setrat(rs.getrat());

	return *this;
}

void hasDMA::View()
{
	cout<<"hasDMA style="<<getsty()<<endl;
	cout<<"hasDMA label="<<getlab()<<endl;
	cout<<"hasDMA rating="<<getrat()<<endl;
}

ostream & operator<<(ostream &os,const hasDMA &rs)
{
	os<<"hasDMA style="<<rs.getsty()<<endl;
	os<<"hasDMA label="<<rs.getlab()<<endl;
	os<<"hasDMA rating="<<rs.getrat()<<endl;
	return os;
}

#include <iostream>
#include "dma.h"
using namespace std;

int main() 
{
	DMA *d[5];
	d[0]=new DMA("Portabelly",8);
	d[1]=new baseDMA("Blimpo33",33);
	d[2]=new lacksDMA("red","Blimpo",4);
	d[3]=new hasDMA("Mercator","Buffalo",5);

	d[0]->View();
	d[1]->View();
	d[2]->View();
	d[3]->View();

	d[4]=d[0];
	d[4]->View();

//	cout<<*d[0]<<endl;
//	cout<<(baseDMA)*d[1]<<endl;
//	cout<<(lacksDMA)*d[2]<<endl;
//	cout<<(hasDMA)*d[3]<<endl;

	return 0;
}