internas ¿Es posible usar clases anónimas en C++?




clases anidadas en programacion (3)

En C ++, una unión anónima es una unión de esta forma:

 union { ... } ;

Define un objeto sin nombre de un tipo sin nombre. Sus miembros se inyectan en el ámbito circundante, por lo que uno puede referirse a ellos sin utilizar un <object>. Prefijo que de lo contrario sería necesario.

En este sentido, no existen clases anónimas (que no sean uniones --- en C ++ uniones son clases).

Por otro lado, las clases sin nombre (incluyendo estructuras y uniones) no son nada inusuales.

union { ... } x;
class { ... } y;
typedef struct { ... } z;

y son nombres de objetos sin nombre. z es un nombre de typedef que es un alias para una estructura sin nombre. No se les llama anónimos porque este término está reservado para la forma anterior de una unión.

[](){}

Las Lambdas son objetos sin nombre de tipos de clase sin nombre, pero tampoco se les llama anónimos.

He visto clases anónimas en código C++ en Quora. Se compila con éxito y se ejecuta.

Código aquí:

#include <iostream>

auto func()
{
    class // no name
    {
      public:
             int val;
    } a;

    a.val = 5;

    return a;
}

int main()
{
    std::cout << func().val << std::endl;
    return 0;
}

Entonces, ¿es válido en C ++?

Además, tengo curiosidad por saber, ¿es posible usar clases anónimas en C ++?


Answer #1

Siempre fue posible escribir algo como esto:

typedef struct { int a; } type;

Ahora, si nos fijamos en la parte struct { int a } , esta es una estructura anónima. En C ++, básicamente no hay diferencia entre estructuras y clases (excepto los modificadores de acceso predeterminados). Por lo tanto, es posible tener estructuras / clases anónimas.


Answer #2

No solo eso, puede crear más instancias de la clase utilizando decltype .

#include <iostream>

class 
{
   public:
      int val;
} a;


int main()
{
   decltype(a) b;
   a.val = 10;
   b.val = 20;

   std::cout << a.val << std::endl;
   std::cout << b.val << std::endl;
   return 0;
}

Salida:

10
20




c++14