这是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的类?
答案 0 :(得分:1)
它不是C ++标准术语中的聚合 - 请参阅 8.5.1聚合部分:
聚合是一个数组或类 (第9条)没有用户声明 构造函数(12.1),没有私有或 受保护的非静态数据成员 (第11条),没有基类(条款 10),没有虚函数(10.3)。
答案 1 :(得分:1)
不,不需要吸气剂和制定者。它仍然是一个简单的数据结构,其中没有方法实现修改数据结构的操作 - 比较,分配,交换在这里不是'行为',它们是语言执行基本操作和使数据结构实际可用所需的存根。
您需要确定结构字段之间是否存在任何依赖关系或不变量。如果它们存在(或将来可能存在),请使用getter或setter来确保它们(即,如果属性b被更改,则调整属性a)。如果没有,请宣布一切公开。 name
和age
是人类的分离属性,我不认为访问者在这里真的是必要的。当然这是一个品味问题。