Хорошо, чтобы обеспечить конструктор + тривиальные операторы для бездействующих агрегатов?

Это дополнительный вопрос к 2043381.

Учтите следующее:

struct DataBundle
{
   std::string name;
   int age;

   DataBundle() : age(0) {}
   DataBundle(const std::string& name, int age)
       : name(name), age(age) {}
   void swap(DataBundle& rhs)
       {name.swap(rhs.name); std::swap(age, rhs.age);}
   DataBundle& operator=(DataBundle rhs) {swap(rhs); return *this;}
   bool operator==(const DataBundle& rhs) const
       {return (name == rhs.name) && (age == rhs.age);}
   bool operator!=(const DataBundle& rhs) const {return !(*this == rhs);}
}

В духе правила № 41 Стандартов кодирования C++ (см. Статью по теме), будет ли это все еще считаться агрегатом без поведения? Мне не нравится писать "тупые" классы, в основном с использованием методов получения / установки, и я предпочитаю использовать общедоступную структуру, чтобы указать, что это просто "bundle-o-data". Но в приведенном выше примере я нахожусь в точке, где я должен сделать DataBundle класс с геттерами / сеттерами?

2 ответа

Решение

Нет, пока нет необходимости в геттерах и сеттерах. Это по-прежнему простая структура данных, в которой нет методов, реализующих действия, изменяющие структуру данных - сравнивать, присваивать, менять местами здесь нет "поведения", они являются заглушкой, необходимой языку для выполнения базовых операций и для того, чтобы структура данных была фактически используемой.

Вам необходимо решить, есть ли какие-либо зависимости или инварианты, которые будут храниться между полями структуры. Если они существуют (или могут существовать в будущем), используйте средства получения или установки, чтобы гарантировать их (то есть отрегулируйте атрибут a, если атрибут b изменен). Если нет, объявите все публично. name а также age это развязанные свойства человека, я не думаю, что здесь действительно нужны аксессоры. Конечно, это дело вкуса.

Ну, это не агрегат в терминах C++ Standard - см. Раздел 8.5.1 Агрегаты:

Агрегат - это массив или класс (раздел 9) без объявленных пользователем конструкторов (12.1), без закрытых или защищенных нестатических элементов данных (раздел 11), без базовых классов (раздел 10) и без виртуальных функций (10.3).

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