代码之家  ›  专栏  ›  技术社区  ›  Emile Cormier

可以为无行为聚合提供构造函数+普通运算符吗?

  •  0
  • Emile Cormier  · 技术社区  · 15 年前

    这是一个后续问题 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编写“dumb”类,而是使用一个全公共结构来表示它只是一个“bundle-o-data”。但是在上面的例子中,我是否已经到了应该使用getter/setter使databundle成为一个类的时候了?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Alexander Gessler    15 年前

    不,还不需要盖特和塞特。它仍然是一个普通的数据结构,没有任何方法实现修改数据结构的操作——比较、分配、交换在这里不是“行为”,它们是语言执行基本操作和使数据结构实际可用所需的存根。

    您需要决定结构字段之间是否存在依赖项或不变量。如果它们存在(或将来可能存在),请使用getter或setter来确保它们(即,如果属性B发生更改,则调整属性A)。如果没有,把一切都公布出来。 name age 是一个人的非耦合属性,我不认为访问器在这里是真正必要的。当然,这是一个品味问题。

        2
  •  1
  •   anon    15 年前

    它不是C++标准术语的集合——参见 8.5.1集料 :

    聚合是数组或类 (第9条)未声明用户 施工人员(12.1),无私人或 受保护的非静态数据成员 (第11条),无基类(第11条) 10),无虚拟功能(10.3)。