### 嵌套类

在 C++中，允许在一个类内部再定义一个类，这样的类被称之为嵌套类。例如，下面的代码在定义 CList 类时，在内部又定义了一个嵌套类 CNode。

定义嵌套类

#define MAXLEN 128 //定义一个宏

class CList //定义 CList 类

{

public: //嵌套类为公有的

class CNode //定义嵌套类 CNode

{

friend class CList; //将 CList 类作为自己的友元类

private:

int m_nTag; //定义私有成员

public:

char m_Name[MAXLEN]; //定义公有数据成员

void OutputNode() //定义公有方法

{

cout << m_Name << endl;

}

}; //CNode 类定义结束

public:

CNode m_Node; //定义一个 CNode 类型数据成员

void SetNodeName(const char *pchData) //定义成员函数

{

if (pchData != NULL) //判断指针是否为空

{

strcpy(m_Node.m_Name, pchData); //访问 CNode 类的共有数据

}

}

void SetNodeTag(int nTag) //定义成员函数

{

m_Node.m_nTag = nTag; //访问 CNode 类的私有数据

}

};

上述的代码在嵌套类 CNode 中定义了一个私有成员 m_nTag，定义了一个共有成员 m_Name，对于外围类 CList 来说，通常它不能够访问嵌套类的私有成员，虽然嵌套类是在其内部定义的。但是，上述代码在定义 CNode 类时将 CList 类作为自己的友元类，这使得 CList 类能够访问 CNode 类的私有成员。

对于内部的嵌套类来说，只允许其在外围的类域中使用，在其他类域或者作用域中是不可以见的。例如下面的定义是非法的。

int main(int argc, char* argv[])

{

CNode node; //错误的定义，不能访问 CNode 类

return 0;

}

上述代码在 main 函数的作用域中定义了一个 CNode 对象，导致 CNode 没有被声明的错误。对于 main 函数来说，嵌套类 CNode 是不可见的。但是可以通过使用外围的类域作为限定符来定义 CNode 对象。如下的定义将是合法的。

int main(int argc, char* argv[])

{

CList::CNode node; //合法的定义

return 0;

}

上述代码通过使用外围类域作为限定符访问到了 CNode 类。但是这样做通常是不合理的，也是有限制条件的。因为既然定义了嵌套类，通常都不允许在外界访问，这违背了使用嵌套类的原则。为了防止在外界直接使用嵌套类，可以将嵌套类定义为私有成员。例如：

私有嵌套类

#define MAXLEN 128 //定义一个宏

class CList //定义 CList 类

{

private: //嵌套类为公有的

class CNode //定义私有嵌套类 CNode

{

friend class CList; //将 CList 类作为自己的友元类

private:

int m_nTag; //定义私有成员

public:

char m_Name[MAXLEN]; //定义公有数据成员

void OutputNode() //定义公有方法

{

cout << m_Name << endl;

}

}; //CNode 类定义结束

public:

CNode m_Node; //定义一个 CNode 类型数据成员

void SetNodeName(const char *pchData) //定义成员函数

{

if (pchData != NULL) //判断指针是否为空

{

strcpy(m_Node.m_Name, pchData); //访问 CNode 类的共有数据

}

}

void SetNodeTag(int nTag) //定义成员函数

{

m_Node.m_nTag = nTag; //访问 CNode 类的私有数据

}

};

这样，在外界就不能试图通过“CList::CNode”形式访问嵌套类了。

int main(int argc, char* argv[])

{

CList::CNode node; //错误的语句，不能访问私有嵌套类

return 0;

}

在设计嵌套类时，嵌套类的方法可以不是内联方法。例如，可以将嵌套类 CNode 中的方法放置在类的声明之外。

void CList::CNode::OutputNode() //定义 OutputNode 方法

{

cout << m_Name << endl;

}

上述代码将 CNode 类的 OutputNode 方法定义放置在类声明之外，但是由于 CNode 是一个嵌套类，因此需要使用“CList::CNode”形式标识方法所属的类。