Compartir a través de


Declaraciones de clase anidada

Una clase puede declararse dentro del ámbito de otro tipo.Esta clase se denomina una “clase anidada”. Las clases anidadas se consideran estar dentro del ámbito de la clase envolvente y están disponibles para su uso dentro de ese ámbito.Para hacer referencia a una clase anidada de un ámbito distinto del ámbito de inclusión inmediato, debe utilizar un nombre completo.

El ejemplo siguiente se muestra cómo declarar clases anidadas:

// 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 y BufferedIO::BufferedOutput se declaran dentro de BufferedIO.Estos nombres de clase no están visibles fuera del ámbito de la clase BufferedIO.Sin embargo, un objeto de BufferedIO tipo no contiene objetos de tipos BufferedInput o BufferedOutput.

Las clases anidadas pueden utilizar directamente nombres, nombres de tipo, nombres de miembros estáticos, y de enumeradores sólo la clase envolvente.Para utilizar nombres de otros miembros de clase, debe utilizar punteros, referencias, o nombres de objeto.

En el ejemplo anterior de BufferedIO , la enumeración IOError se puede tener acceso directamente por funciones miembro de clases anidadas, BufferedIO::BufferedInput o BufferedIO::BufferedOutput, como se muestra en la función good.

[!NOTA]

Las clases anidadas declaran sólo tipos dentro del ámbito de la clase.no producen los objetos contenidos de la clase anidada que se creará.El ejemplo anterior declara dos clases anidadas pero no declara ningún objeto de estos tipos de clase.

Una excepción a la visibilidad del ámbito de una declaración de la clase es cuando un nombre de tipo se declara con una declaración adelantada.En este caso, el nombre de clase declarado por la declaración adelantada está visible fuera de la clase envolvente, con el ámbito definido ser el ámbito menor de no envolvente.Por ejemplo:

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

Vea también

Referencia

Clases, estructuras, uniones y