C++ primer plus第六版课后编程题答案14.3(仅供参考)


 

 

这道有点坑,不太懂怎么构造那个队列模板,下面的仅供参考。

做出来的希望能留言给我看看是怎么实现的

Queue.cpp

//#include <iostream>
//#include "Work.cpp"
//#include <memory>//智能指针模板
//using namespace std;
//为了简化,这个队列我就只定义简单的功能了



template <class T>
class Queue{
private:
	struct Node{//在类里面定义一个结构,用于实现队列中的节点
	T *t;
	Node *next;
	};
	//enum{MAX=10};
	Node *front;
	Node *rear;
	int size;
public:
	Queue()
	{
		front=rear=nullptr;	
		size=0;
	}
	~Queue()
	{
		//T *p=front;
		//while(p!=rear)
			//delete p;
	}
	bool isEmpty()
	{
		return front==nullptr;
	}
	/*	队列长度不设上限
	bool isFull()
	{
		return size==MAX;
	}*/
	bool enQueue(T *t)
	{
		Queue::Node *add=new Queue::Node;
		add->t=t;//需要该类定义一个“=”运算符
		if(isEmpty())
		{
			front=add;
			add->next=nullptr;
			rear=add->next;
			return true;
		}
		else
		{
		rear=add;
		add->next=nullptr;
		rear=add->next;
		return true;
		}
		return false;
}
	T show()
	{
		Node *p=front;
		if(p==rear)
			return rear->t;
		else
		{
			p=p->next;
			return show();
		}
			
	}



};

Worker.cpp

#include <iostream>
#include <string>
using namespace std;
class Worker{
private:
	string fullname;
	long id;
protected:
	virtual void Data()const{
		cout<<"Name:"<<fullname<<endl;
		cout<<"Employee ID:"<<id<<endl;
	};
	virtual void Get()
	{
		getline(cin,fullname);
		cout<<"Enter worker's ID:";
		cin>>id;
		while(cin.get()!='\n')
			continue;
	};
public:
	Worker():fullname("no one"),id(0L)
	{};
	Worker(const string &s,long n):fullname(s),id(n)
	{};
	Worker(const Worker &w)
	{
		fullname=w.fullname;
		id=w.id;
	}
	virtual ~Worker()=0{};
	virtual void Set()=0;//虚基类里面的纯虚方法可以交由派生类具体实现
	virtual void Show()const=0;
};



class Waiter:virtual public Worker{
private:
	int panache;
protected:
	void Data()const{
		cout<<"Panache rating:"<<panache<<endl;
	};
	void Get()
	{
		cout<<"Enter waiter's panache rating:";
		cin>>panache;
		while(cin.get()!='\n')
			continue;
	};
public:
	Waiter():Worker(),panache(0){}
	Waiter(const string &s,long n,int p=0):Worker(s,n),panache(p){}
	Waiter(const Worker &wk,int p=0):Worker(wk),panache(p){}
	void Set()
	{
		cout<<"Enter waiter's name:";
		Worker::Get();
		Get();
	};
	void Show()const
	{
		cout<<"Category waiter:"<<endl;
		Worker::Data();
		Data();
	};
};



class Singer:virtual public Worker
{
protected:
	enum{Vtypes=7};//类似于前置声明
	enum{other,alto,contralto,soprano,bass,baritone,tenor};
private:
	static char *pv[Vtypes];//={"other","alto","contralto","soprano","bass","baritone","tenor"};
	int voice;
protected:
	void Data()const
	{
		cout<<"Vocl range:"<<pv[voice]<<endl;
	};
	void Get(){
		cout<<"Enter number for singer's vocal range:"<<endl;
		int i;
		for(i=0;i<Vtypes;i++)//用于展示
		{
			cout<<i<<":"<<pv[i]<<"   ";
			if(i%4==3)
				cout<<endl;
			
		}
		if(i%4!=0)
			cout<<endl;
		cin>>voice;
		while(cin.get()!='\n')
			continue;
	}
public:
	Singer():Worker(),voice(other){}
	Singer(const string &s,long n,int v=other):Worker(s,n),voice(other){}
	Singer(const Worker &wk,int v=other):Worker(wk),voice(v){}
	void Set()
	{
		cout<<"Enter singer's name:";
		Worker::Get();
		Get();
	}
	void Show()const
	{
		cout<<"Category:singer"<<endl;
		Worker::Data();
		Data();
	}
};

//char *Singer::pv[Singer::Vtypes]={"other","alto","contralto","soprano","bass","baritone","tenor"};





class SingerWaiter:public Singer,public Waiter
{
protected:
	void Data()const
	{
		Singer::Data();
		Waiter::Data();
	}
	void Get()
	{
		Waiter::Get();
		Singer::Get();
	}
public:
	SingerWaiter(){}
	SingerWaiter(const string &s,long n,int p=0,int v=other)
		:Worker(s,n),Waiter(s,n,p),Singer(s,n,v){}
	SingerWaiter(const Worker &wk,int p=0,int v=other)
		:Worker(wk),Waiter(wk,p),Singer(wk,v){}
	SingerWaiter(const Waiter &wt,int v=other)
		:Worker(wt),Waiter(wt),Singer(wt,v){}
	SingerWaiter(const Singer &sg,int p=0)
		:Worker(sg),Waiter(sg,p),Singer(sg){}

	void Set()
	{
		cout<<"Enter singerWaiter 's name:"<<endl;
		Worker::Get();
		Get();
	}
	void Show()const{
		cout<<"Category:singerWaiter:"<<endl;
		Worker::Data();
		Data();
	}

};

main143.cpp

#include <iostream>
#include "QueueTP.cpp"
#include "Work.cpp"
//#include <string>
using namespace std;
//char *Singer这一句如果放到其他地方会出现重定义错误;
char *Singer::pv[Singer::Vtypes]={"other","alto","contralto","soprano","bass","baritone","tenor"};
const int SIZE=5;
void main143()
{
	Queue<Worker*> line;//注意类型应为Worker*
	Worker *lolas[SIZE];

	int ct;
	for(ct=0;ct<SIZE;ct++)
	{
		char choice;
		cout<<"Enter the employee category:"<<endl
		<<"w:waiter			 s:singer"<<endl
		<<"t:singerWaiter    q:quit"<<endl;
		cin>>choice;
		while(strchr("wstq",choice)==NULL)//p564关于strchr有解释
		{		
			cout<<"Please enter a w,s,t or q:";
			cin>>choice;
		}
		if(choice=='q')
			break;
		switch(choice)
		{
			
		case 'w':lolas[ct]=new Waiter;break;
		case 's':lolas[ct]=new Singer;break;
		case 't':lolas[ct]=new SingerWaiter;break;
		/*
		case 'w':line.enQueue(new Waiter());break;
		case 's':lolas[ct]=new Singer;break;
		case 't':lolas[ct]=new SingerWaiter;break;
		*/
		}
		cin.get();
		lolas[ct]->Set();

		line.enQueue(&lolas[ct]);
	}
	cout<<"Here is your staff:"<<endl;
	int i;
	for(i=0;i<ct;i++)
	{
		lolas[i]->Show();
		cout<<endl;
	}

	cout<<endl<<endl;
	cout<<"Next is the line:"<<endl;
	//line.show()->Show();


	cin.get();

};

 

 


发表回复

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