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

Поиск:

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


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


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

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



DjoNIK, зачем делать в данном случае постоянную функцию-член? просто для красного словца?  как эта функция изменит вызывающий ее объект? обоснуй пожалуйста. 



Цитата(DjoNIK @  13.10.2008,  11:37 Найти цитируемый пост)
mrbrooks, во-первых не прокатит, ибо

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


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


Опытный
**


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

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



Цитата(mrbrooks @  13.10.2008,  12:32 Найти цитируемый пост)
просто для красного словца?

Нет, для наглядности. Чтобы небыло соблазна, чтобы читающий объявления метода не глядя в определение мог понять все.
Может тогда и в
Код

(const MyCells& Cell1, const MyCells& Cell2)

можно обойтись без const? Мы ведь все-равно не меняем объект переданный по ссылке.
Цитата(mrbrooks @  13.10.2008,  10:05 Найти цитируемый пост)
это правильно.

это ты говорил про использование const по-возможности везде smile

Добавлено через 4 минуты и 36 секунд
Цитата(mrbrooks @  13.10.2008,  12:32 Найти цитируемый пост)
ибо прокатит - так как автор сказал 

не прокатит, ибо, судя по первому посту, автор собирался сравнивать адреса через метод GetAddr(), а значения ячеек через 
Код

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



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


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


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

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



Цитата(DjoNIK @  13.10.2008,  12:40 Найти цитируемый пост)
это ты говорил про использование const по-возможности везде

я не имел ввиду использовать постоянную функцию-член.  smile  моя вина - что не ясно выразился. 
Дело в том что и использования const в сигнатуре функции при сравнение результата метода GetAddr() даст ошибку при компиляции. 

По этому рабочий вариант как раз будет тот что я давал в начале а именно:

Код

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

 Что бы использовать const в сигнатуре функции нужно обращаться уже не к методам класса а к его элементам определяющим результат метода GetAddr().

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


Опытный
**


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

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



Парни, погодите! Я похоже всех нас запутал! (1)Можно перегрузить == и в нем проверять сразу и адреса, и текст. (2)Можно разнести это сравнение (чтобы в главной программе опредилить, что именно не совпало и выдать соответствующее предупреждение). Чтобы реализовать 2, нужно 2 раза перегрузить ==. 
  Код можно написать как в разных перегрузчиках, так и в методах, которые будут вызываться этими перегрузчиками.

Вроде так.
Тогда какой вариант выбрать, чтобы разделить одно от другого? == - это не текст, и аргументы - целые объекты. Может сделать эти GetAddr() и GetText() и запихнуть в один ==, но при этом передавая еще один аргумент - флаг, что именно сравниваем?
Код

bool operator +(MyCell& C1, MyCell& С2, int flagTypeSravn)
{
 if(flagTypeSravn==0) return GetAddr();
 else return GetText();   

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


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



 
Цитата(Gunslinger @  13.10.2008,  13:09 Найти цитируемый пост)
Может сделать эти GetAddr() и GetText() и запихнуть в один ==, но при этом передавая еще один аргумент - флаг, что именно сравниваем?

  smile  smile 

будьте проще : 
Код


struct Addr { int x; int y; };

class MyCell
{        Addr  m_addr;//адрес ячейки
          String m_text;//Значение ячейки
 public:
   Addr  GetAddr () const { return m_addr; }
   String GetText () const { return m_text; }
  ...
};


MyCell c1,c2;
if (c1.GetText() == c2.GetText()) ..
if (c1.GetAddr() == c2.GetAddr()) ..




Это сообщение отредактировал(а) mes - 13.10.2008, 17:13


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


Эксперт
***


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

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



Gunslinger, так я не понял, зачем тебе вообще этот == сдался? операторы только для удобства добавлены, не более, и пытаться весь свой код под них подстраивать не нужно

или создай функцию, как я тебе в 3м посте написал или сделай, как посоветовал mes


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


Опытный
**


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

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



Большое спасибо за помощь. Со сравнением действительно уперся не в тему. 
При компиляции пишет ошибки:
[C++ Error] MyCells.h(8): E2303 Type name expected
и
[C++ Error] MyCells.h(8): E2303 Type name expected
Вот описание:
Код

#ifndef MyCellsH
#define MyCellsH
#include <system.hpp>

class MyCells {
      public:
                 MyCells(int x,int y,String& Text);
            Address GetAddr();
            String GetText();
            void SetAddr(int x,int y);
            void SetText(String& Text);            
};
#endif

Выдает ошибку на Address GetAddr(); Где-то ошибся.
Реализация:
Код

#include "MyCells.h"

struct Address
             {
              int x;
              int y;
              };

class MyCells {
     private:
               Address addr; 
               String Text;
};

  MyCells::MyCells(int x,int y,String& Text)
  {
    addr.x=x;
    addr.y=y;
    Text=Text;
  };

Address MyCells::GetAddr() 
 {
    return addr;   
 };

String GetText()
 {
   return Text;
 };

void SetAddr(int x,int y)
  {
   addr.x=x,addr.y=y;
return 0;
  };

void SetText(String& Text)
  {
    Text=Text;
    return 0;
  };

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


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


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

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



структуру Address опиши в хидаре
PM MAIL   Вверх
Gunslinger
Дата 14.10.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Описывал. Выдает кучу ошибок:
[C++ Error] MyCells.cpp(5): E2238 Multiple declaration for 'MyCells'
[C++ Error] MyCells.h(10): E2344 Earlier declaration of 'MyCells'
[C++ Error] MyCells.cpp(20): E2108 Improper use of typedef 'Address'
и т.п., вытекающие следом.

Описуха хедера:
Код

#ifndef MyCellsH
#define MyCellsH
#include <system.hpp>
struct Address
             {
              int x;
              int y;
              };

class MyCells {
      public:
                 MyCells(int x,int y,String& Text);
//------далее уже выкладывал

Если за концом структуры убрать; пишет:
[C++ Error] MyCells.h(10): E2176 Too many types in declaration и встает на class MyCells {

Это сообщение отредактировал(а) Gunslinger - 14.10.2008, 13:42
PM MAIL   Вверх
Alek86
Дата 14.10.2008, 14:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



из cpp вот это чудо
Код
struct Address
             {
              int x;
              int y;
              };

class MyCells {
     private:
               Address addr; 
               String Text;
};

выкинь

Добавлено через 1 минуту и 47 секунд
в плюсах не разрешено разделенное определение класса
так что класс MyCells собери в 1 (в ашнике)
в cpp оставь реализации функций

и вообще почитай учебник


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


Опытный
**


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

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



Alek86, убрал. только теперь опять вернулись к ошибкам моего утреннего поста:
[C++ Error] MyCells.h(8): E2303 Type name expected
и
[C++ Error] MyCells.h(8): E2139 Declaration missing ;
Указывает на Address GetAddr(); в хедере.

Почему private надо было удалить? Адресная структура должна быть открыта? А куда же девать String Text? 
PM MAIL   Вверх
mrbrooks
Дата 14.10.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Gunslinger, ну удалять! а перенести.
Код

#ifndef MyCellsH
#define MyCellsH
#include <system.hpp>
struct Address
             {
              int x;
              int y;
              };
class MyCells {
      public:
                 MyCells(int x,int y,String& Text);
            Address GetAddr();
            String GetText();
            void SetAddr(int x,int y);
            void SetText(String& Text); 
    private:
               Address addr; 
               String Text;           
};
#endif


Добавлено @ 14:53
Цитата(Alek86 @  14.10.2008,  14:26 Найти цитируемый пост)
Добавлено через 1 минуту и 47 секунд
в плюсах не разрешено разделенное определение класса
так что класс MyCells собери в 1 (в ашнике)
в cpp оставь реализации функций
и вообще почитай учебник 


здесь же все сказано smile

Добавлено @ 14:56
Код

#include "MyCells.h"

  MyCells::MyCells(int x,int y,String& Text)
  {
    addr.x=x;
    addr.y=y;
    Text=Text;
  };
Address MyCells::GetAddr() 
 {
    return addr;   
 };
String   MyCells::GetText()
 {
   return Text;
 };
void   MyCells::SetAddr(int x,int y)
  {
   addr.x=x,addr.y=y;
return 0;
  };
void   MyCells::SetText(String& Text)
  {
    ::Text=Text; 
    return 0;
  };


Это сообщение отредактировал(а) mrbrooks - 14.10.2008, 14:57
PM MAIL   Вверх
Gunslinger
Дата 14.10.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mrbrooks, добавления не было. сейчас зашел - увидел.
Alek86, почитаю, только прогу добью. Может я специздание Страуструпа не той стороной смотрел, но у него вроде в хедере - интерфейс, а в cpp - его реализация и приватные свойства.
Вот готовые файлы:
хедер:
Код

#ifndef MyCellsH
#define MyCellsH
#include <system.hpp>

struct Address {
                int x;
                int y;
               };

class MyCells {
      private:
              Address addr;
              String Text;
       public:
                 MyCells(int x,int y,String& Text);
            Address GetAddr(); 
            String GetText();
            void SetAddr(int x,int y);
            void SetText(String& Text);
            
};
#endif
 

реализация:
Код

#include "MyCells.h"
#include <system.hpp>
  MyCells::MyCells(int x,int y,String& Text)
  {
    addr.x=x;
    addr.y=y;
    Text=Text;
  };

Address MyCells::GetAddr() 
 {
    return addr;
 };

String GetText()
 {
   return Text; //------------------------[C++ Error] MyCells.cpp(17): E2108 Improper use of typedef 'Text'
 };

void SetAddr(int x,int y)
  {
   addr.x=x; addr.y=y;//-----[C++ Error] MyCells.cpp(22): E2451 Undefined symbol 'addr'. Неправильно, а как нужно обращаться к структуре из
                                                                           //метода - незнаю.
  };

void SetText(String& Text)
  {
    Text=Text;
  };

Ошибок 2. Закомментировал в код.


Это сообщение отредактировал(а) Gunslinger - 14.10.2008, 16:17
PM MAIL   Вверх
Alek86
Дата 14.10.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



поменяй
Код
String GetText()
в сpp на
Код
String MyCells::GetText()

и так далее


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


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


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

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



Gunslinger, камрад ты внимательно смотрел тот код который я тебе специально подправил?
PM MAIL   Вверх
Страницы: (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.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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