嵌套的类型名称

Microsoft C++ 支持嵌套类型的声明 - 命名和匿名。匿名结构和类是 Microsoft 专用 C++ 扩展。匿名联合是标准的。

[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id

备注

上面的第一个类名称引用了外部类;第二个类名称引用了内部类。这些名称可以进一步嵌套。 因此,

Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2

是类的所有有效名称。使用可选模板关键字让模板标识符代替类名称,如下所示

MyClass<int>::Inner
Outer<int>::template Inner<int>

在某些编程情况下,这对于定义嵌套类型很有意义。 这些类型仅对类类型(在其中定义成员函数)的成员函数可见。 也可以通过使用范围解析运算符 (::) 构造限定类型名称来使其可见。

备注

使用嵌套类型的一个常用类层次结构是 iostream。在 iostream 标头文件中,类 ios 的定义包含一系列枚举类型,它们已被打包以便仅用于 iostream 库。

示例

以下示例定义了嵌套类:

// nested_type_names1.cpp
class WinSystem
{
public:
   class Window
   {
   public:
      Window();   // Default constructor.
      ~Window();   // Destructor.
      int NumberOf();   // Number of objects of class.        
      int Count();   // Count number of objects of class.
   private:
      static int CCount;
   };

   class CommPort
   {
   public:
      CommPort();   // Default constructor.
      ~CommPort();   // Destructor.
      int NumberOf();   // Number of objects of class.
      int Count();   // Count number of objects of class.
   private:
      static int CCount;
   };
};

// Initialize WinSystem static members.
int WinSystem::Window::CCount = 0;
int WinSystem::CommPort::CCount = 0;

int main()
{
}

若要访问在嵌套类中定义的名称,请使用范围解析运算符 (::) 构造完整的类名。 此运算符的用法在前面的示例中的 static 成员的初始化中进行了演示。 若要在程序中使用嵌套类,请使用与下类似的代码:

WinSystem::Window Desktop;
WinSystem::Window AppWindow;

cout << "Number of active windows: " << Desktop.Count() << "\n";

可按以下方式定义嵌套匿名类或结构:

// nested_type_names2.cpp
class Ledger
{
   class
   {
   public:
      double PayableAmt;
      unsigned PayableDays;
   } Payables;

   class
   {
   public:
      double RecvableAmt;
      unsigned RecvableDays;
   } Receivables;
};

int main()
{
}

匿名类必须是没有成员函数和静态成员的聚合。

结束 Microsoft 专用

备注

虽然可以在类声明中定义枚举类型,但反过来则不然;不能在枚举声明中定义类类型。

请参见

参考

C++ 类型说明符