C++primer plus第六版課後程式設計練習答案13.3
阿新 • • 發佈:2019-01-26
#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; }