Вложенные объявления классов

Класс можно объявить в области другого класса.Подобный класс называется "вложенным классом." Подразумевается, что в области включающего класса и вложенные классы доступны для использования в пределах данной области.Чтобы обратиться к вложенному классу из области, отличной от его непосредственного внешней области видимости, необходимо использовать полное имя.

В следующем примере показано, как объявить вложенные классы:

// 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 объявите in BufferedIO.Эти имена классов не видны вне области класса BufferedIO.Однако объект типа BufferedIO отсутствуют объекты типов BufferedInput OR BufferedOutput.

Вложенные классы могут напрямую использовать имена, имена типов, имена статических элементов и с помощью перечислителей можно только из включающего класса.Для использования имен других членов класса необходимо использовать указатели, ссылки и имен объектов.

В предыдущих BufferedIO пример, перечисление IOError может быть напрямую функции-членами во вложенных классах BufferedIO::BufferedInput OR BufferedIO::BufferedOutput, как показано в функции good.

ПримечаниеПримечание

Вложенные классы объявляются только типы в области класса.Они не вызывают, которые содержат объекты вложенного класса.В предыдущем примере объявляется 2 вложенного класса, но не объявляет никаких объектов этих типов класса.

Исключение в области видимости вложенные объявления класса, когда имя типа объявляется вместе с передним объявлением.В этом случае имя класса, объявленное передним объявлением видимые за пределами включающего класса, при его область, указанная для наименьшей включающего областью, не являющийся классом.Примеры.

// 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;
}

См. также

Ссылки

Классы, структуры и объединения