2013-05-30 4 views
6

У меня есть класс MyCloth и один один объект экземпляр этого класса, который я реализованным так:C++ объект равенства

MyCloth** cloth1; 

И в какой-то момент в программе, я буду делать что-то вроде этого:

MyCloth** cloth2 = cloth1; 

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

Как я могу сделать эту проверку равенства? Я думал, может быть, проверить, указывают ли они на те же адреса. Это хорошая идея? Если да, то как мне это сделать?

+6

Вы * не * есть "объект класса' MyCloth'". Если вы считаете, что вам действительно нужно переосмыслить многое о C++. –

+5

... Почему ptr ptr? – IdeaHat

+1

@ Kerrek SB: Я просто пытался объяснить, что я хочу делать, я знаю, что у меня не может быть объекта класса MyCloth, но я не знал, как еще это сказать, я новичок в C++ и пытается понять, как я создаю проект. – user2399378

ответ

8

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

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

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

Предоставлено MyCloth * pcloth1, * pcloth2; как бы сравнить содержимое двух? ваш пример показывает, как сделать это только для не указателей. – user2813274

+0

@ user2813274 - 'if (* pcloth1 == * pcloth2) ...' –

+0

Как вы можете определить, проверяет ли это, на что указывают указатели, или если содержимое двух мест одинаково? – user2813274

3

Если вы хотите определить метод, с помощью которого можно заказать сравнение набора объектов вашего класса 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; 

Это действительный и приведет к ложному.

instancePointer == instanceVaribalePointer; 

Это также действительный и приведет к ложному.

instanceVariablePointer == &instanceVariable; 

Это также справедливо и приведет к ИСТИНА

instanceVariable == *instanceVariablePointer; 

Это будет использовать оператор == мы определили выше, чтобы получить результат TRUE;

+0

ОП пытается проверить идентичность объекта или равенство, а не сравнивать. Кроме того, OP указывает, что «MyCloth - очень сложный класс, и я не могу создать функцию isEqual». –

+0

Второй вариант, который вы описываете. Как мне это сделать? – user2399378

+0

@ user2399378 Использование '==' для сравнения указателей будет проверять, что они указывают на то же самое место в памяти. –

Смежные вопросы