好的,为无行为聚合提供构造函数+普通运算符?

时间:2010-01-24 19:07:11

标签: c++ aggregate pod

这是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);}
}

本着C ++编码标准规则#41的精神(参见相关article),这仍然被视为无行为聚合吗?我不喜欢用大多数getter / setter编写“哑”类,而宁愿使用全公共结构来表明它只是一个“bundle-o-data”。但是在上面的例子中,我是否应该让DataBundle成为一个带有getter / setter的类?

2 个答案:

答案 0 :(得分:1)

它不是C ++标准术语中的聚合 - 请参阅 8.5.1聚合部分:

  

聚合是一个数组或类   (第9条)没有用户声明   构造函数(12.1),没有私有或   受保护的非静态数据成员   (第11条),没有基类(条款   10),没有虚函数(10.3)。

答案 1 :(得分:1)

不,不需要吸气剂和制定者。它仍然是一个简单的数据结构,其中没有方法实现修改数据结构的操作 - 比较,分配,交换在这里不是'行为',它们是语言执行基本操作和使数据结构实际可用所需的存根。

您需要确定结构字段之间是否存在任何依赖关系或不变量。如果它们存在(或将来可能存在),请使用getter或setter来确保它们(即,如果属性b被更改,则调整属性a)。如果没有,请宣布一切公开。 nameage是人类的分离属性,我不认为访问者在这里真的是必要的。当然这是一个品味问题。