c++嵌套类

在类里面定义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...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值