Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перегрузить оператор сравнения, для конкретного метода? 
V
    Опции темы
Gunslinger
Дата 13.10.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Привет. Пример класса (для компактности писал сделал все в одном файле:
Код

class MyCells{
        int x,int y;//адрес ячейки
        String Text;//Значение ячейки
  public:
         bool operator ==(MyCells& Cell1, MyCells& Cell2);//сравнить адреса, сравнть значения


В исходном коде будет нечто вроде:
Код

MyCells C1, C2;
//....
//...
if(C1==C2) cout<<"Несовпадение";


НО! Мне нужно отдельно сравнивать адреса и значения и, соответственно, выводить разный текст, напр.:
Код

if(C1.GetAddr()==C2.GetAddr()) cout<<"Несовпадение адресов";

Как написать перегрузку на сравнение адреса/текста, напр.:
Код

//... class
 bool operator==(MyCells& Cell1.GetAddr(), MyCells& Cell2.GetAdr()); --- ???

, но как это показать в перегрузке сравнения?

PM MAIL   Вверх
mrbrooks
Дата 13.10.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Код

bool operator==(MyCells& Cell1, MyCells& Cell2)
{
return (Cell1.GetAddr() == Cell2.GetAdr());
}

PM MAIL   Вверх
Alek86
Дата 13.10.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



для этого тебе подойдет обычная функция
Код
if(C1.MatchAddr(C2)) cout<<"Несовпадение адресов";


mrbrooks, тогда у него тут
Цитата(Gunslinger @  13.10.2008,  09:50 Найти цитируемый пост)
if(C1==C2) cout<<"Несовпадение";

неправильно работать будет


Это сообщение отредактировал(а) Alek86 - 13.10.2008, 10:01


--------------------
user posted image    user posted image
PM MAIL   Вверх
mrbrooks
Дата 13.10.2008, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



если у тебя метод возвращает строки - то соответсвенно тогда сравнивай как строки - strcmp для char. Ты в чем пишешь?
PM MAIL   Вверх
DjoNIK
Дата 13.10.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Для начала было бы неплохо 
Код

class MyCells{
        int x,int y;//здесь вообще синтаксическая ошибка
        String Text;//Значение ячейки
  public:
         bool operator ==(const MyCells& Cell1, const MyCells& Cell2) const; //сравнить адреса, сравнть значения

Цитата(Gunslinger @  13.10.2008,  09:50 Найти цитируемый пост)
Как написать перегрузку на сравнение адреса/текста

Создать отдельно структуру адрес, и там перегрузить сравнение.
В Итоге будет что-то вроде
Код

class Adress 
{
private:
   int i;
   int j;
/*
...
*/
public:
    bool operator ==(const Adress& a1, const Adress& a2) const;
/*
...
*/
};

class MyCells
{
private:
   Adress adr;
   String Text;//Значение ячейки
/*
...
*/
public:
    bool operator ==(const MyCells& mc1, const MyCells& mc2) const;
/*
...
*/
};


Это сообщение отредактировал(а) DjoNIK - 13.10.2008, 10:04


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
Alek86
Дата 13.10.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



кстати Gunslinger, лучше опреатор сравнения определять так (с констами)
Код
bool operator==(const MyCells& Cell1, const MyCells& Cell2);

и вообще слово конст использовать настолько часто, насколько это возможно


--------------------
user posted image    user posted image
PM MAIL   Вверх
mrbrooks
Дата 13.10.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Alek86, ну если строки сравнивает - то можно и так - только если у типа строк перегружен оператор сравнения, либо функцию заюзать для этого типа.
PM MAIL   Вверх
DjoNIK
Дата 13.10.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Alek86, топик выше и метод тоже const smile


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
mrbrooks
Дата 13.10.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(Alek86 @  13.10.2008,  10:03 Найти цитируемый пост)

и вообще слово конст использовать настолько часто, насколько это возможно 
 это правильно.

Добавлено через 5 минут и 32 секунды
Вообще для начала нужно определиться какой тип возвращает метод GetAdr()

Добавлено через 6 минут и 22 секунды
Скорее всего целый  smile  аффтор проясни ситуацию  smile 
PM MAIL   Вверх
Gunslinger
Дата 13.10.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(DjoNIK @  13.10.2008,  10:02 Найти цитируемый пост)
class MyCells{
        int x,int y;//здесь вообще синтаксическая ошибка

не понял. вроде все правильно, по умолчанию в привейт ставится.

mrbrooks, ситуация такая. Есть набор ячеек (MyCels Cell1, Cell2, ...), у каждой ячейки есть адрес и значение. У каждого объекта свой адрес и значение. Задача: проверить, совпадают ли адреса и значения 2х объектов. И GetAddr(), и  GetText() возвращают логическое значение. А в главной программе делается обычный if на сравнение адресов и значений 2х объектов. 

зы не понимаю, зачем разделять адрес и все остальное
ззы делаю в билдере.  
PM MAIL   Вверх
DjoNIK
Дата 13.10.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Цитата(Gunslinger @  13.10.2008,  11:09 Найти цитируемый пост)
не понял. вроде все правильно, по умолчанию в привейт ставится.

Код

 int x, int y;
 //или
 int x; int y;



--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
mrbrooks
Дата 13.10.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Если логическое значение то 
Код

bool operator==(const MyCells& Cell1, const MyCells& Cell2)
{
return (Cell1.GetAddr() == Cell2.GetAdr());
}


должно прокатить.
PM MAIL   Вверх
DjoNIK
Дата 13.10.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Цитата(Gunslinger @  13.10.2008,  11:09 Найти цитируемый пост)
не понимаю, зачем разделять адрес и все остальное

С ростом функционала может потребоваться разбиение.
Да и вообще, если ты думаешь о ЧЕМ-ТО как о самостоятельной сущности, то желательно это ЧТО-ТО выделить в класс. А адрес, как я понимаю,  и есть такая сущность.

Добавлено через 3 минуты и 39 секунд
mrbrooks, во-первых не прокатит, ибо

Цитата(Gunslinger @  13.10.2008,  09:50 Найти цитируемый пост)
НО! Мне нужно отдельно сравнивать адреса и значения и, соответственно, выводить разный текст

Во вторых, если
Цитата(mrbrooks @  13.10.2008,  10:05 Найти цитируемый пост)
Цитата(Alek86 @  13.10.2008,  10:03 )
>> >>и вообще слово конст использовать настолько часто, насколько это возможно 
>> это правильно.
, тоуж тогда

Код

bool operator==(const MyCells& Cell1, const MyCells& Cell2) const
{
return (Cell1.GetAddr() == Cell2.GetAdr());
}


Добавлено через 6 минут и 17 секунд
И только сейчас задумался...
Цитата(Gunslinger @  13.10.2008,  11:09 Найти цитируемый пост)
И GetAddr(), и  GetText() возвращают логическое значение. 

Как так. Ты у ячейки c1 получаешь адрес, то почему у тебя возвращаеться логическое значение. Что оно означает? Как-то странно.



--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
Gunslinger
Дата 13.10.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Да, с разным текстом. Есть вариант возвращать int: 0 - ок, 1- несовпадение адреса, 2 - несовпадение текста. Но по мне этот вариант нехороший. Гораздо понятнее работать с каждым отдельно.  Но как перегрузить один и тот же оператор для методов?
DjoNIK, спасибо за поправку.

Добавлено через 3 минуты и 43 секунды
Цитата(DjoNIK @ 13.10.2008,  11:37)
Цитата(Gunslinger @  13.10.2008,  11:09 Найти цитируемый пост)
не понимаю, зачем разделять адрес и все остальное

С ростом функционала может потребоваться разбиение.

так далеко продумывать не могу. можешь какой-нибудь пример на вскидку?

Добавлено через 6 минут и 3 секунды
DjoNIK, дав вроде логично. Сравниваются x,y объектов. Если они одинаковы - возвращается true. Так же с текстом.

Добавлено через 8 минут и 52 секунды
блин. с GetAddr и GetText перемудрил. У методов же есть доступ к закрытым членам... У меня ту немного каша, потому что еще думаю сделать замену координат из главной программы.
PM MAIL   Вверх
DjoNIK
Дата 13.10.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Цитата(Gunslinger @  13.10.2008,  11:49 Найти цитируемый пост)
 можешь какой-нибудь пример на вскидку?

Цитата(DjoNIK @  13.10.2008,  11:37 Найти цитируемый пост)
Да и вообще, если ты думаешь о ЧЕМ-ТО как о самостоятельной сущности, то желательно это ЧТО-ТО выделить в класс. А адрес, как я понимаю,  и есть такая сущность.

хорошее правило.
Ведь со временем тебе нужно будет активно работать с твоими "ячейками". Интерфейс доступа будет разрастаться. В нем ты можешь запутаться. Если не ты сам, то пользователь твоего класса.

Еще один вариант - случай, когда выполняя операции с ячейкой ты будешь работать с двумя "непонятыми" (или понятными только тебе) int-ми, довольно неприятный. Другое дело - обрабатывать i и j как единое целое.

Да и необходимость в коментарий вида
Код

int x;int y;//адрес ячейки

отпала бы сама собой.


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0833 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.