【问题标题】:C++ object equalityC++ 对象相等
【发布时间】:2013-05-30 18:22:23
【问题描述】:

我有一个类 MyCloth 和我这样实例化的该类的一个对象实例:

MyCloth** cloth1;

在程序的某一时刻,我会做这样的事情:

MyCloth** cloth2 = cloth1;

然后在稍后的某个时间,我想检查cloth1cloth2 是否相同。 (类似于 Java 中的对象相等,仅在此处,MyCloth 是一个非常复杂的类,我无法构建 isEqual 函数。)

如何进行这种相等性检查?我在想也许检查它们是否指向相同的地址。这是一个好主意吗?如果是这样,我该怎么做?

【问题讨论】:

  • 你确实没有有一个“MyCloth类的对象”。如果您相信这一点,那么您真的必须重新考虑 C++。
  • @Kerrek SB:我只是想解释我想做什么,我知道我不能拥有 MyCloth 类的对象,但我不知道该怎么说,我是 C++ 新手,并试图在创建项目时弄清楚它。
  • @MadScienceDreams:cloth1 和cloth2 是指针的指针(每个cloth 由定义其参数、行为等的指针组成)
  • 您要做的是验证每个指针是否指向相同的内存分配?
  • @user2399378 指针只是内存空间中的一个位置。它是内存中某个位置的地址。指针的“类型”表示如何解释该位置的 1 和 0。当您使用指针指针时,您有一个地址的地址。你所拥有的都没有指向一个类的实例。但是,如果您确实初始化了一个类,例如 'MyCloth* c1 = new MyCloth();'比你可以使用'MyCloth* c2 = NULL;/*或其他*/ c1==c2;'通过确定两个指针是否指向同一个内存来检查它是否是同一个实例。这不适用于虚拟继承!

标签: c++ pointers equality


【解决方案1】:

您可以通过比较两个指针持有的地址来测试对象身份。你提到Java;这类似于测试两个引用是否相等。

MyCloth* pcloth1 = ...
MyCloth* pcloth2 = ...
if ( pcloth1 == pcloth2 ) {
    // Then both point at the same object.
}   

您可以通过比较两个对象的内容来测试对象的相等性。在 C++ 中,这通常通过定义 operator== 来完成。

class MyCloth {
   friend bool operator== (MyCloth & lhs, MyCloth & rhs );
   ...
};

bool operator== ( MyCloth & lhs, MyCloth & rhs )
{
   return ...
}

定义了 operator==,你可以比较相等性:

MyCloth cloth1 = ...
MyCloth cloth2 = ...
if ( cloth1 == cloth2 ) {
    // Then the two objects are considered to have equal values.
}   

【讨论】:

  • 给定 MyCloth *pcloth1, *pcloth2;如何比较两者的内容?您的示例显示了如何仅对非指针执行此操作。
  • @user2813274 -- if ( *pcloth1 == *pcloth2 ) ...
  • 如何判断这是检查指针指向的位置,还是两个位置的内容相同?
  • @user2813274 - 你的pcloth1 的值是一个地址。 *pcloth1 的值是一个 MyCloth 对象。表达式*pcloth1 取消引用 指针 pcloth1。由于表达式中的两个操作数都是 MyCloth 对象,因此检查的是内容,而不是地址。
【解决方案2】:

如果您想定义一种方法来对您的客户类的一组对象进行比较。例如:

someClass instance1;
someClass instance2;

您可以通过为此类重载

class someClass
{

    bool operator<(someClass& other) const
    {
        //implement your ordering logic here
    }
};

如果你想做的是比较,看看对象是否是同一个对象,你可以做一个简单的指针比较,看看它们是否指向同一个对象。我认为您的问题措辞不佳,我不确定您要问哪个。

编辑:

对于第二种方法,真的很简单。您需要访问对象的内存位置。您可以通过许多不同的方式访问它。以下是一些:

class someClass
{

    bool operator==(someClass& other) const
    {
        if(this == &other) return true; //This is the pointer for 
        else return false;
    }
};

注意:我不喜欢上面的内容,因为 == 运算符通常比仅比较指针更深入。对象可以表示具有相似品质但并不相同的对象,但这是一种选择。你也可以这样做。

someClass *instancePointer = new someClass();
someClass instanceVariable;
someClass *instanceVariablePointer = &instanceVariable;


instancePointer == instanceVariable;

这是无意义的和无效/错误的。如果它甚至可以编译,取决于您的标志,希望您使用的标志不允许这样做!

instancePointer == &instanceVariable; 

这是有效的,但会导致错误。

instancePointer == instanceVaribalePointer;  

这也是有效的,会导致错误。

instanceVariablePointer == &instanceVariable;

这也是有效的,结果是 TRUE

instanceVariable == *instanceVariablePointer;

这将使用我们上面定义的 == 运算符来获得 TRUE 的结果;

【讨论】:

  • OP 正在尝试测试对象身份或相等性,而不是比较。此外,OP 指定“MyCloth 是一个非常复杂的类,我无法构建 isEqual 函数”。
  • 您描述的第二个变体。我该怎么做?
  • @user2399378 使用== 比较指针将检查它们是否指向完全相同的内存位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多