C++对象相等性

13

我有一个类MyCloth,并且我实例化了一个该类的对象,方法如下:

MyCloth** cloth1;

而在程序的某个点,我会做类似这样的事情:

MyCloth** cloth2 = cloth1;

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

我该如何进行相等性检查?我想也许可以检查它们是否指向相同的地址。这个想法好吗?如果是,怎么做?


7
你并没有一个“类为MyCloth的对象”。如果你认为有,那么你需要重新思考很多关于C++的事情。 - Kerrek SB
1
@Kerrek SB:我只是想解释一下我想做什么,我知道我不能有一个MyCloth类的对象,但我不知道该怎么表达,我是C++新手,在创建项目时试图弄清楚它。 - user2399378
@MadScienceDreams:cloth1和cloth2是指针的指针(每个布料都由指针定义其参数、行为等)。 - user2399378
你想做的是验证每个指针是否指向相同的内存分配? - Francis.Beauchamp
2
指针只是内存空间中的一个位置。它是内存中位置的地址。指针的“类型”表示如何解释该位置中的二进制数。当您使用指向指针时,您有一个地址的地址。您所拥有的所有内容都没有指向类的实例。但是,如果您初始化了一个类,例如'MyCloth* c1 = new MyCloth();',那么您可以使用'MyCloth* c2 = NULL;/or whatever/ c1==c2;'来检查它是否是相同的实例,通过确定这两个指针是否指向相同的内存。这在虚继承中不起作用! - IdeaHat
显示剩余3条评论
2个回答

22

你可以通过比较两个指针所保存的地址来测试对象的身份。你提到了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
如果(*pcloth1 == *pcloth2)... - Andy Thomas
你如何判断它是检查指针指向的位置,还是两个位置的内容是否相同? - user2813274
1
@user2813274 - 你的pcloth1的值是一个地址。*pcloth1的值是一个MyCloth对象。表达式*pcloth1 解引用了指针pcloth1。由于表达式中的两个操作数都是MyCloth对象,因此检查的是内容而不是地址。 - Andy Thomas

5
如果您想定义一种方法来对自定义类的一组对象进行比较排序。例如:
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; 

这是有效的,并且将导致false。

instancePointer == instanceVaribalePointer;  

这也是有效的,结果将为false。
instanceVariablePointer == &instanceVariable;

这也是有效的,结果为TRUE。
instanceVariable == *instanceVariablePointer;

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

OP 正在尝试测试对象的身份或相等性,而不是比较。此外,OP 指定了“MyCloth 是一个非常复杂的类,我无法构建一个 isEqual 函数”。 - Andy Thomas
你所描述的第二种变体,我该怎么做? - user2399378
@user2399378 使用 == 比较指针时,将检查它们是否指向完全相同的内存位置。 - Code-Apprentice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接