Можно ли использовать анонимные классы в C++?

Я видел анонимные занятия в C++ код на Quora. Он успешно скомпилирован и запущен.

Код здесь:

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

Итак, действительно ли это в C++?

Кроме того, мне интересно знать, возможно ли использовать анонимные классы в C++?

3 ответа

Решение

В C++ анонимный союз - это объединение этой формы:

 union { ... } ;

Он определяет безымянный объект безымянного типа. Его члены вводятся в окружающий объем, так что к ним можно обращаться, не используя <object>. префикс, который в противном случае был бы необходим.

В этом смысле не существует анонимных классов (которые не являются объединениями - в C++ объединения являются классами).

С другой стороны, безымянные классы (включая структуры и союзы) не являются чем-то необычным.

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

x а также y именуются объекты безымянных типов. z является typedef-именем, которое является псевдонимом для неназванной структуры. Они не называются анонимными, потому что этот термин зарезервирован для вышеуказанной формы объединения.

[](){}

Лямбды являются безымянными объектами безымянных типов классов, но они также не называются анонимными.

Мало того, вы можете создать больше экземпляров класса с помощью 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;
}

Выход:

10
20

Всегда можно было написать что-то вроде этого:

typedef struct { int a; } type;

Теперь, если вы посмотрите на struct { int a } часть, это анонимная структура. В C++ нет принципиальной разницы между структурами и классами (за исключением модификаторов доступа по умолчанию). Таким образом, возможно иметь анонимные структуры / классы.

Другие вопросы по тегам