P533 第四题
port.h
#include<iostream>
using namespace std;
class Port
{
private:
char *brand;
char style[20];
int bottles;
public:
Port(const char *br="none",const char *st="none",int b=0);
Port(const Port &p);
virtual ~Port();
Port &operator=(const Port &p);
Port &operator+=(int b);
Port &operator-=(int b);
int BottleCount();
virtual void show();
friend ostream &operator<<(ostream &os,const Port &p);
};
class VintagePort:public Port
{
private:
char *nickname;
int year;
public:
VintagePort();
VintagePort(const char *br,int b,const char *nn,int y);
VintagePort(const VintagePort &vp);
~VintagePort();
VintagePort &operator=(const VintagePort &vp);
void show();
friend ostream &operator<<(ostream &os,const VintagePort &vp);
};
port.cpp
#include"Port.h"
#include<iostream>
#include<cstring>
using namespace std;
Port::Port(const char *br,const char *st,int b)
{
brand=new char[strlen(br)+1];
strcpy(brand,br);
strcpy(style,st);
bottles=b;
}
Port::Port(const Port &p)
{
brand=new char[strlen(p.brand)+1];
strcpy(brand,p.brand);
strcpy(style,p.style);
bottles=p.bottles;
}
Port::~Port()
{
delete []brand;
}
Port & Port::operator=(const Port &p)
{
if(this==&p)
return *this;
delete []brand;
brand=new char[strlen(p.brand)+1];
strcpy(brand,p.brand);
strcpy(style,p.style);
bottles=p.bottles;
return *this;
}
Port &Port::operator+=(int b)
{
bottles=bottles+b;
return *this;
}
Port &Port::operator-=(int b)
{
bottles=bottles-b;
return *this;
}
int Port::BottleCount()
{
return bottles;
}
void Port::show()
{
cout<<"Brand:"<<brand<<endl;
cout<<"Kind:"<<style<<endl;
cout<<"Bottles:"<<bottles<<endl;
}
ostream &operator<<(ostream &os,const Port &p)
{
os<<p.brand<<","<<p.style<<","<<p.bottles<<endl; //友元要使用p.brand 来访问私有成员变量
return os;
}
VintagePort::VintagePort()
{
}
VintagePort::VintagePort(const char *br,int b,const char *nn,int y):Port(br,"VintagePort",b)
{
nickname=new char[strlen(nn)+1];
strcpy(nickname,nn);
year=y;
}
VintagePort::VintagePort(const VintagePort &vp):Port(vp)
{
nickname=new char[strlen(vp.nickname)+1];
strcpy(nickname,vp.nickname);
year=vp.year;
}
VintagePort::~VintagePort()
{
delete[]nickname;
}
VintagePort &VintagePort::operator=(const VintagePort &vp)
{
if(this==&vp)
return *this;
Port::operator=(vp);
delete []nickname;
nickname=new char[strlen(vp.nickname)+1];
strcpy(nickname,vp.nickname);
year=vp.year;
return *this;
}
void VintagePort::show()
{
Port::show();
cout<<"Nickname:"<<nickname<<endl;
cout<<"Year:"<<year<<endl;
}
ostream &operator<<(ostream &os,const VintagePort &vp)
{
os<<(const Port &)vp;
os<<vp.nickname<<","<<vp.year<<endl; //友元要使用p.brand 来访问私有成员变量
return os;
}
useport.cpp
#include<iostream>
#include"Port.h"
using namespace std;
int main()
{
Port p("Gallo","tawny",20);
VintagePort vp("JALL",30,"Old Velet",1950);
cout<<p<<endl;
cout<<vp<<endl;
Port p1=p;
p1.show();
cout<<endl;
VintagePort vp1=vp;
vp1.show();
cout<<endl;
VintagePort vp2(vp);
vp2.show();
vp+=(10);
cout<<vp;
cout<<"11111111111111111"<<endl;
Port* p_port;
p_port = &p1;
p_port->show();
cout << endl;
p_port = &vp;
p_port->show();
cout << endl;
return 0;
}