Clases internas

En C++, una clase interna es una clase que está definida dentro de otra clase. La clase interna puede acceder a los miembros privados y protegidos de la clase externa, lo que proporciona una encapsulación adicional y una relación de dependencia entre las dos clases.

Existen diferentes tipos de clases internas en C++, incluyendo clases internas regulares, clases internas anidadas y clases internas locales. Aquí tienes una descripción de cada uno de estos tipos:

Clases internas regulares: Son clases definidas dentro de otra clase y se pueden utilizar como cualquier otro tipo de clase. Se declaran dentro de la clase externa y pueden acceder a todos los miembros de la clase externa, incluso a los miembros privados. Pueden tener sus propios miembros y métodos, y se pueden instanciar de forma independiente. Se accede a ellas utilizando el nombre de la clase externa seguido del operador de resolución de ámbito ::.

Clases internas anidadas (nested classes): Son clases definidas dentro de otra clase, pero están declaradas como static. Estas clases no tienen acceso a los miembros no static de la clase externa. Se pueden instanciar sin necesidad de crear un objeto de la clase externa y se accede a ellas utilizando el nombre de la clase externa seguido del operador de resolución de ámbito ::.

Clases internas locales (local classes): Son clases definidas dentro de una función o un bloque de código. Estas clases solo son visibles dentro del ámbito en el que están definidas y no pueden ser instanciadas fuera de ese ámbito. Pueden acceder a los miembros y variables locales de la función o bloque de código en el que se definen.

Aquí tienes un ejemplo que muestra cómo se pueden definir y utilizar clases internas en C++:

En este ejemplo, OuterClass es la clase externa que contiene tanto una clase interna regular (InnerClass) como una clase interna anidada (NestedClass).

La clase OuterClass también tiene un método que define una clase interna local (LocalClass).

Puedes instanciar las clases internas utilizando el nombre de la clase externa seguido del operador de ámbito :: y el nombre de la clase interna. Por ejemplo, OuterClass::InnerClass innerObj; crea una instancia de la clase interna InnerClass utilizando el nombre de la clase externa OuterClass.