Равенство объектов 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;