Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

анонимные классы в c++

этот код вполне себе нормально компилируется.
class { public:
//...
} anonymous;
Зачем и для каких целей применяются не именованные классы?


Ответ

Для начала хочу обратить ваше внимание, что в C++ нет анонимных классов с ключевыми словами class или struct. Вы путаете понятия безымянного класса и анонимного класса. Эти понятия различны и имеют разный семантический смысл. В своем вопросе вы ведете речь именно про безымянные классы
Определения именованных классов определяют именованные типы. Используя это имя вы явно можете объявлять члены такого класса, в объявлении которых присутствует спецификатор типа класса, объекты этого типа или, например, параметры функций. Кроме того, если имя имеет внешнее связывание, то оно будет означать одну и ту же сущность в разных единицах компиляции, если включить объявление этого имени в эти единицы компиляции.
В безымянном классе невозможно, например, объявить конструкторы, деструктор, операторы, которые имеют тип возвращаемого значения или типы параметров, включающие в себя имя класса.
Вы также, например, не можете объявлять члены данных класса, которые являются указателями или ссылками на объекты класса.
В безымянном классе не разрешается объявлять статические члены данных класса.
Из стандарта C++ (9.4.2 Static data members)
4 [ Note: There shall be exactly one definition of a static data member that is odr-used (3.2) in a program; no diagnostic is required. —end note ] Unnamed classes and classes contained directly or indirectly within unnamed classes shall not contain static data members.
Например, как объявить узел списка, если вы не можете в определении этого узла объявить член данных, являющийся указателем на следующий или предыдущий узел?
Так что возможности безымянных классов очень ограничены.
Безымянные классы обычно используются как вложенные классы других классов или как локальные классы, когда введенный таким образом безымянный тип класса не требуется за пределами той области видимости, где этот безымянный класс определен.

Комментариев нет:

Отправить комментарий