Равенство объектов C++

у меня есть класс MyCloth и один экземпляр объекта этого класса, который я создал следующим образом:

MyCloth** cloth1;

и в какой-то момент в программе я сделаю что-то вроде этого:

MyCloth** cloth2 = cloth1;

а потом в какой-то момент позже, я хочу проверить, если cloth1 и cloth2 то же самое. (Что-то вроде равенства объектов в Java, только здесь, MyCloth - очень сложный класс, и я не могу построить

2 ответов


вы можете проверить объект личность путем сравнения адресов, удерживаемых двумя указателями. Вы упоминаете 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 ...
}

с оператором== defined, вы можете сравнить равенство:

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

если вы хотите определить метод, с помощью которого можно заказать сравнение набора объектов класса custome. Например:

someClass instance1;
someClass instance2;

можно перегружать оператор

class someClass
{

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

если вы хотите сравнить и посмотреть, являются ли объекты буквально одним и тем же объектом, вы можете сделать простое сравнение указателей, чтобы увидеть, указывают ли они на один и тот же объект. Я думаю, что ваш вопрос плохо сформулирован, я не уверен, к чему вы идете.

EDIT:

для второго метода это действительно довольно просто. Вам нужен доступ к местоположению вашего объекта в памяти. Вы можете получить доступ к этому по-разному. Вот несколько:

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;