國立屏東大學 資訊工程系 物件導向程式設計
turnin code cpp.hw3
due date: April 16, 23:59PM
考慮實例演練1的程式,修改成為使用類別繼承以完成程式設計。參考下面的程式,我們定義了三種會員型態(以MemberType列舉型別宣告),並簡化之前的Member類別設計:
#ifndef _MEMBER_
#define _MEMBER_
#include "name.h"
enum MemberType {Gold, Silver, Normal};
class Member
{
private:
Name *name;
string phone;
MemberType type;
public:
void showInfo();
void setPhone(string str);
Name *getName();
void setName(Name *n);
string getPhone();
void setMemberType(MemberType mt);
MemberType getMemberType();
};
class GoldMember : public Member
{
private:
float discount;
public:
GoldMember(Member *m);
void setDiscount(float d);
float getDiscount();
void showInfo();
};
class SilverMember : public Member
{
private:
int freeMinute;
public:
SilverMember(Member *m);
void setFreeMinute(int m);
int getFreeMinute();
void showInfo();
};
#endif
我們將上述的類別視為一般會員「Normal」,並繼承「Member」類別完成「GoldMember」與「SilverMember」類別的設計。我們也先修改了「DataGetter」類別,使其能支援這三種類別的資料讀取:
Member * DataGetter::getMemberData(istream &is)
{
Member *newMember=new Member;
string str;
getline(is, str);
newMember->setName(new Name(str));
getline(is, str);
newMember->setPhone(str);
getline(is, str);
if(str.compare("Gold")==0)
{
newMember->setMemberType(Gold);
GoldMember *newGoldMember = new GoldMember(newMember);
getline(is, str);
float discount;
stringstream convert;
convert << str;
if(!(convert >> discount))
discount=0.0;
newGoldMember->setDiscount(discount);
delete newMember;
return newGoldMember;
}
else if(str.compare("Silver")==0)
{
newMember->setMemberType(Silver);
SilverMember *newSilverMember = new SilverMember(newMember);
getline(is, str);
int freeMinute;
stringstream convert;
convert << str;
if(!(convert >> freeMinute))
freeMinute=0;
newSilverMember->setFreeMinute(freeMinute);
delete newMember;
return newSilverMember;
}
else if(str.compare("Normal")==0)
{
newMember->setMemberType(Normal);
return newMember;
}
return newMember;
}
#include <iostream>
#include <fstream>
#include "member.h"
#include "dataGetter.h"
using namespace std;
typedef Member* Members;
int main()
{
Members *members = new Members[5];
DataGetter *dg = new DataGetter;
ifstream fin("members.dat");
for(int i=0;i<5;i++)
{
members[i] = dg->getMemberData(fin);
}
fin.close();
cout << "Input: ";
string findName = dg->getAString(cin);
bool found=false;
while(findName.compare("Quit")!=0)
{
for(int i=0;i<5;i++)
{
if(((members[i]->getName())->get_lastname()).compare(findName)==0)
{
if(members[i]->getMemberType() == Gold)
{
((GoldMember *)members[i])->showInfo();
}
else if(members[i]->getMemberType() == Silver)
{
((SilverMember *)members[i])->showInfo();
}
else if(members[i]->getMemberType() == Normal)
{
members[i]->showInfo();
}
found=true;
}
}
if(!found)
cout << "Member not found!" << endl;
found=false;
cout << "Input: ";
findName = dg->getAString(cin);
}
cout << "Bye" << endl;
delete [] members;
}
相關檔案與Makefile皆已放置於「/home/stu/public/cpp/2015SCPPHW3/」目錄中,請複製到你的家目錄內以進行本作業。在該目錄中,已存在一個可執行檔「hw3demo」(注意,執行hw3demo時,必須在同一目錄內存在有members.dat測試檔),你必須自行測試此程式,以瞭解本題要求的輸入及操作為何? 並試著完成與hw3demo一樣的程式。
你必須完成一個名為「member2.cpp」的程式,其中包含了GoldMember與SilverMember類別的成員函式之實作,測試無誤後,請turning該檔案。本題僅需turnin 「member2.cpp」檔案。