Мы часто используем структуры c ++ для определения структуры данных, а не класса, который может быть законченным модулем с методами-членами. Теперь, в глубине души, мы знаем, что они оба одинаковы (грубо говоря).
Тот факт, что мы часто используем / относимся к структурам как к объектам, содержащим только данные, заставляет нас также не добавлять конструкторы по умолчанию. Но конструкторы всегда хороши, они упрощают работу и помогают устранить ошибки.
Будет ли одобрено добавить конструкторы по умолчанию в мои структуры данных?
Делает ли реализация конструктора по умолчанию также структуру struct Non-POD (обычный старый тип данных) при условии соблюдения других критериев?
Чтобы представить вещи в перспективе, рассмотрим простой пример, но на самом деле структура была бы намного больше.
struct method
{
char name[32];
float temperature;
int duration;
};
Каждый раз, когда я создаю метод, мне приходится беспокоиться (если не сказать больше), если я забыл установить какое-либо значение. Представьте, что я забыл установить temperature
и применить метод к системе, которая теперь имеет случайное высокое значение и вызывает хаос. Или я забыл установить, duration
и теперь метод применяется сам по себе для неизвестной высокой продолжительности.
Почему я должен брать на себя ответственность каждый раз инициализировать объект, а не реализовывать его конструктор, который это гарантирует?
struct
иclass
является то , что один по умолчанию частных и другая общественности.Ответы:
Иногда целесообразно добавить конструктор в структуру, а иногда нет.
Добавление конструктора (любого конструктора) в структуру предотвращает использование в нем инициализатора агрегата. Поэтому, если вы добавите конструктор по умолчанию, вам также придется определить конструктор не по умолчанию, инициализирующий значения. Но если вы хотите, чтобы вы всегда инициализировали всех участников, это уместно.
Добавление конструктора (опять же, любого конструктора) делает его не POD, но в C ++ 11 большинство правил, которые ранее применялись только к POD, были изменены для применения к стандартным объектам компоновки, и добавление конструкторов не нарушает этого. Таким образом, агрегатный инициализатор - это единственное, что вы теряете. Но это также часто большая потеря.
источник
С C ++ 11 вы можете сделать
И когда вы забудете что-то инициализировать, вы получите инициализацию по умолчанию.
источник
Быстрый ответ:
Это зависит от того, чего вы хотите достичь.
Длинный, расширенный, скучный ответ:
Вы попали в гвоздь.
Мне обычно не нравится, что "C ++" позволяет "Struct (s)" позволяет объявлять методы. Предпочтительно, я использую явные «Класс (ы)» для обязательных методов и POD «Структуру (ы)» только для полей.
Тем не менее, я согласен, что некоторые основные простые операции, такие как:
Требуются, и, в этих обстоятельствах, методы для структур, имеют смысл.
Предложение
Другое потенциальное решение состоит в том, чтобы использовать структуры POD, но все же концептуально рассматривать их как классы и объекты.
Оберните эти объявления в пространство имен и добавьте глобальные функции для наиболее важных действий.
Объявление кода может быть похожим на это:
Код, который применяет решение, может быть примерно таким:
Этот альтернативный подход лучше, когда требуется огромное выделение памяти для данных или взаимодействие с другими низкоуровневыми общими библиотеками.
Этот подход с некоторыми изменениями применяется в разработке игр.
дополнительный
Лично я рассматриваю расширение синтаксиса для «C ++» или даже новый PL на основе «C ++», который решает эту проблему:
Приветствия.
источник