Хорошо, чтобы обеспечить конструктор + тривиальные операторы для бездействующих агрегатов?
Это дополнительный вопрос к 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).