嵌套选件类声明
在另一个类的范围内,类中声明。 这样的类称为 “嵌套类”。嵌套类视为位于封闭类的范围内并且可为该范围内使用。 除了直接封闭范围外,若要引用从范围的嵌套类,则必须使用完全限定名。
下面的示例演示如何声明嵌套的类:
// nested_class_declarations.cpp
class BufferedIO
{
public:
enum IOError { None, Access, General };
// Declare nested class BufferedInput.
class BufferedInput
{
public:
int read();
int good()
{
return _inputerror == None;
}
private:
IOError _inputerror;
};
// Declare nested class BufferedOutput.
class BufferedOutput
{
// Member list
};
};
int main()
{
}
BufferedIO::BufferedInput 和 BufferedIO::BufferedOutput 在 BufferedIO内声明。 这些类名未显示在类 BufferedIO的范围。 但是,类型 BufferedIO 对象不包含类型 BufferedInput 或 BufferedOutput任何对象。
嵌套类可以直接使用名称、静态成员的类型名称,名称和枚举数只从封闭类。 若要使用其他类成员的名称,您必须使用指针,引用或对象名。
如函数 good所示,在前面的 BufferedIO 的示例中,枚举 IOError 可以直接由嵌套类, BufferedIO::BufferedInput 或 BufferedIO::BufferedOutput的成员函数访问,。
备注
嵌套类声明在类范围内的那些类型。它们不会使嵌套类的包含的对象创建的。前面的示例声明两个嵌套类,但没有声明这些类类型任何对象。
对嵌套类声明的范围可见性的例外情况是类型名称与前向声明同时声明。 在这种情况下,前向声明声明的类名在封闭类以外可见的,其范围被定义为最小的封闭非类的大小。 例如:
// nested_class_declarations_2.cpp
class C
{
public:
typedef class U u_t; // class U visible outside class C scope
typedef class V {} v_t; // class V not visible outside class C
};
int main()
{
// okay, forward declaration used above so file scope is used
U* pu;
// error, type name only exists in class C scope
u_t* pu2; // C2065
// error, class defined above so class C scope
V* pv; // C2065
// okay, fully qualified name
C::V* pv2;
}