在类里面定义1个其他类,这和在类里面使用一个其他类的对象作为数据成员是不一样的,在下面的例子中,还可以学到如何在c++里面定义和使用链表的节点
queuetp.h
#pragma once
template<class Item>
class QueueTP
{
private:
enum{Q_SIZE=10};
// Node is a nested class definition
class Node
{
public:
Item item;
Node* next;
Node(const Item& i):item(i),next(nullptr){}
};
Node* front; // pointer to front of Queue
Node* rear; // pointer to rear of Queue
int items; // current number of items in Queue
const int qsize; // maximum number of items in Queue
QueueTP(const QueueTP& q):qsize(0){}
QueueTP& operator=(const QueueTP& q) { return *this; }
public:
QueueTP(int qs = Q_SIZE);
~QueueTP();
bool isempty() const
{
return items == 0;
}
bool isfull() const
{
return items == qsize;
}
int queuecount() const
{
return items;
}
bool enqueue(const Item& item); // add item to end
bool dequeue(Item& item); // remove item from front
};
// QueueTP methods
template<class Item>
QueueTP<Item>::QueueTP(int qs) :qsize(qs)
{
front = rear = nullptr;
items = 0;
}
template<class Item>
QueueTP<Item>::~QueueTP()
{
Node* temp;
while (front != nullptr) {
temp = front; // save address of front item
front = front->next; // reset pointer to next item
delete temp; // delete former front
}
}
// add item to queue
template<class Item>
bool QueueTP<Item>::enqueue(const Item& item)
{
if (isfull()) return false;
Node* add = new Node(item); // create node
items++;
if (front == nullptr) front = add;
else rear->next = add;
rear = add;
return true;
}
// place front item into item variable and remove from queue
template<class Item>
bool QueueTP<Item>::dequeue(Item& item)
{
if (front == nullptr) {
// std::cout << item << std::endl;
return false;
}
item = front->item;
items--;
Node* temp = front; // save address of first item
front = front->next;
delete temp;
if (items == 0) rear = nullptr;
return true;
}
nested.cpp
#include<iostream>
#include<string>
#include"queuetp.h"
int main()
{
using std::string;
using std::cin;
using std::cout;
QueueTP<string> cs(5);
string temp;
/*cs.enqueue("hablee");
cs.dequeue(temp);
cs.dequeue(temp);*/
while (!cs.isfull()) {
cout << "please enter your name. you will be "
<< "served in the order of arrival.\n"
"name: ";
getline(cin, temp);
cs.enqueue(temp);
}
cout << "the queue is full. processing begins!\n";
while (!cs.isempty()) {
cs.dequeue(temp);
cout << "now processing " << temp << "...\n";
}
return 0;
}
结果
please enter your name. you will be served in the order of arrival.
name: hablee
please enter your name. you will be served in the order of arrival.
name: yuki
please enter your name. you will be served in the order of arrival.
name: hablee 2
please enter your name. you will be served in the order of arrival.
name: yuki 2
please enter your name. you will be served in the order of arrival.
name: yuki 3
the queue is full. processing begins!
now processing hablee...
now processing yuki...
now processing hablee 2...
now processing yuki 2...
now processing yuki 3...