有没有什么好方法可以确定某个对象是否是另一个对象的克隆?

时间:2015-06-03 11:26:41

标签: c++ clone

使用等于运算符会想到,但是您需要定义它,这意味着每次将新数据成员添加到该类时都要更新它。这需要对正在检查的所有类进行。还有其他好办法吗?

3 个答案:

答案 0 :(得分:4)

对于任何复杂到足以管理自己资源的事情,您都需要一个等于运算符。没有良好的自动比较方式。按位比较适用于POD类型,但没有别的。任何指针成员都可能指向不同的地址,即使该对象在逻辑上似乎是克隆 1 。此外,标准对类的内存布局并不十分具体,因此即使缺少指针和虚函数,它也可能会失败(或者至少它可能是UB)。

1。我认为比较是复杂对象的基本逻辑运算。 POD类型恰好是按位可比的,因为它们是相等的,如果它们是按位相等的。

答案 1 :(得分:1)

有很多行动需要平局。

在C ++ 14中,很容易得到一个。

struct foo {
  template<class Self> // may have template and friend reversed
  friend auto make_tie(Self&&self){
    return std::tie(self.a,self.b,self.c);
  }
  // ...

使用make_tie< == hash swap print(可能还有其他人,例如serialize,但序列化除外需要版本控制)都可以写一次,并适用于多种类型。

您必须维护make_tie才能实现此目的。 C ++ 1z轨道中的反射工作组正致力于增加可能使make_tie需要较少维护的语言。

但至少你会从一个额外的成员变量列表中获得许多操作(一些有用的)。

如果您的指针是智能的,那么它会有所帮助 - 如果您的指针是值语义,==应该比较值,如果共享,==应该比较身份,如果是唯一的,==应该做的。非默认克隆操作将需要非默认的==:将非默认副本推送到资源管理类并将==逻辑放在那里。

答案 2 :(得分:0)

总有C&#39 {s} memcmp功能:

memcmp(&obj1, &obj2, sizeof(obj1));

obj1obj2的类型相同