Хорошо, чтобы предоставить конструктор + тривиальные операторы для агрегатов без поведения? - PullRequest
0 голосов
/ 24 января 2010

Это дополнительный вопрос к 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 ]

1 голос
/ 24 января 2010

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

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

1 голос
/ 24 января 2010

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

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

...