在C/C++中,可以将结构体/类的声明放在另一个类中。在另一个类中声明的类被称为嵌套类,它通过新的类型类作用域来避免名称混乱。
嵌套类的作用域:
1。如果嵌套类是在另一个类的私有部分声明的,则只有后者知道它。
2。如果嵌套类是在另一个类的保护部分声明的,则它对于后者来说是不可见得。
3。如果嵌套类在另一个类的共有部分声明的,则允许后者,后者的派生类以及外部世界使用它,因为它是共有的。
示例嵌套类与模板组合使用:
将Queue类的定义转换为模板时,不会对嵌套类带来问题。
Queue.h头文件
#ifndef QUEUETP_H_
#define QUEUETP_H_
template <class Item>
class QueueTP
{
private:
enum{ Q_SIZE = 10};
class Node
{
public:
Item item;
Node * next;
Node(const Item &i) :item(i), next(0){}
};
Node * front;
Node * rear;
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);
bool dequeue(Item &item);
};
template<class Item>
QueueTP<Item>::QueueTP(int qs) :qsize(qs){
front = rear = 0;
items = 0;
}
template<class Item>
QueueTP<Item>::~QueueTP(){
Node * temp;
while (front != 0){
temp = front;
front = front->next;
delete temp;
}
}
template<class Item>
bool QueueTP<Item>::enqueue(const Item &item){
if (isfull())
return false;
Node *add = new Node(item);
if (add == NULL){
return false;
}
items++;
if (front == 0)
front = add;
else
rear->next = add;
rear = add;
return true;
}
template<class Item>
bool QueueTP<Item>::dequeue(Item &item){
if (front == 0)
return false;
item = front->item;
items--;
Node * temp = front;
front = front->next;
delete temp;
if (items == 0)
rear = 0;
return true;
}
#endif
测试文件
main.cpp
#include <iostream>
#include <string>
#include "Queue.h"
int main(){
using std::cin;
using std::cout;
using std::string;
using std::endl;
QueueTP<string> cs(5);
string 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;
}
测试截图