是否有好的方法来确定一个对象是否是另一个对象的克隆

Is there any good way to determine if an object is a clone of another?

本文关键字:一个对象 是否是 方法 是否      更新时间:2023-10-16

想到了使用相等操作符,但是您需要定义它,这意味着每次向该类添加新的数据成员时都要更新它。所有被检查的类都需要这样做。还有其他好方法吗?

对于任何复杂到足以管理其自身资源的东西,都需要相等操作符是有原因的。没有好的自动比较方法。按位比较适用于POD类型,但除此之外别无它用。任何指针成员都可能指向不同的地址,即使该对象在逻辑上看起来是克隆的1。此外,标准对类的内存布局并不是很具体,所以即使没有指针和虚函数,它也可能失败(或者至少可能是UB)。


<一口> 1。我认为比较是复杂对象的基本逻辑操作。POD类型恰好是按位可比较的因为如果它们按位相等,它们就是相等的

有许多操作需要一个领带。

在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需要更少的维护。

但是至少你从一个额外的成员变量列表中得到了很多操作(一些有用的)。

如果你的指针是智能的——如果你的指针是值语义的,==应该比较值,如果是共享的,==应该比较身份,如果是唯一的,==应该两者都做。非默认克隆操作将需要非默认==:将非默认副本推入资源管理类,并将==逻辑放在那里。

总有C的memcmp函数:

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

其中obj1obj2为同一类型