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

Поиск:

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


Опытный
**


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

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



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

if(c1.GetAddr()==c2.GetAddr())
[C++ Error] выдает ошибку: Unit1.cpp(45): E2093 'operator==' not implemented in type 'Address' for arguments of the same type
Перегрузил ==, пишет тоже самое.
В очередной раз немного хедера:
Код

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

struct Address {
                int x;
                int y;
               };

class MyCells {
      private:
              Address addr;
              String Text;
       public:
                   MyCells();       
                   MyCells(int x,int y,String& T);
            Address GetAddr();
            String GetText();
            void SetAddr(int x,int y);
            void SetText(String& T);
            friend bool operator==(MyCells& c1, MyCells& c2);
};
#endif

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

bool operator==(MyCells& c1, MyCells& c2)
{
  if((c1.addr.x==c2.addr.x)&(c1.addr.y==c2.addr.y)) return true;
      else return false;
}

Как получить доступ свойствам переменной, которая является структурой и которая объявлена как свойство класса? :wacko 

PM MAIL   Вверх
Daevaorn
Дата 16.10.2008, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Gunslinger @  16.10.2008,  09:34 Найти цитируемый пост)
 'operator==' not implemented in type 'Address'

Цитата(Gunslinger @  16.10.2008,  09:34 Найти цитируемый пост)
bool operator==(MyCells& c1, MyCells& c2);

Как-то не вяжется. Вас просят для Address, а вы для MyCells реализовываете.

Добавлено через 1 минуту и 15 секунд
Тогда уж с1==с2 сравнивайте.
PM MAIL WWW   Вверх
Gunslinger
Дата 16.10.2008, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Daevaorn @  16.10.2008,  08:41 Найти цитируемый пост)
Тогда уж с1==с2 сравнивайте.

пишет [C++ Error] Unit1.cpp(45): E2093 'operator==' not implemented in type 'MyCells' for arguments of the same type

Цитата(Daevaorn @  16.10.2008,  08:41 Найти цитируемый пост)
Как-то не вяжется. Вас просят для Address, а вы для MyCells реализовываете.

Так я про это и писал. 
Код

bool operator==GetAddr(Address addr1, Address addr2)

Так разве? Это же передача самостоятельного объекта, а не части класса? А объект структуры описан в private.

Это сообщение отредактировал(а) Gunslinger - 16.10.2008, 08:55
PM MAIL   Вверх
Rickert
Дата 16.10.2008, 09:48 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Цитата(Gunslinger @  16.10.2008,  08:54 Найти цитируемый пост)
bool operator==GetAddr(Address addr1, Address addr2)

Что это такое?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Gunslinger
Дата 16.10.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Rickert @  16.10.2008,  09:48 Найти цитируемый пост)
Что это такое? 

горячичный бред.
PM MAIL   Вверх
bsa
Дата 16.10.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
#ifndef MyCellsH
#define MyCellsH
#include <system.hpp>

struct Address {
                int x;
                int y;
                Address() {}
                Address(int x_, int y_) : x(x_), y(y_) {}
               };
inline bool operator==(const Address& a1, const Address &a2)
{
    return (a1.x == a2.x) && (a1.y == a2.y);
}

class MyCells {
       public:
            MyCells() : addr(x, y){}       
            MyCells(int x, int y, const String& T) : addr(x, y), Text(T) {}
            const Address& GetAddr() { return addr; }
            const String& GetText() { return Text; }
            void SetAddr(int x,int y);
            void SetText(const String& T);
            bool operator==(const MyCells& c) const {
               return (addr == c.addr) && (Text == c.Text);
            }
      private:
              Address addr;
              String Text;
};
#endif


Это сообщение отредактировал(а) bsa - 16.10.2008, 11:55
PM   Вверх
mes
Дата 16.10.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(bsa @  16.10.2008,  11:53 Найти цитируемый пост)
       MyCells() : addr(x, y){}    

oчепятка 
Код

   MyCells() : addr(0, 0){}   


Это сообщение отредактировал(а) mes - 16.10.2008, 12:15


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


Опытный
**


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

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



Код

bool operator==(const MyCells& c1) const {              return (addr==c1.addr)&&(Text==c1.Text); }

[C++ Error] MyCells.h(28): E2093 'operator==' not implemented in type 'Address' for arguments of the same type

Я непонял 
Код
 inline bool operator==(const Address& a1, const Address &a2)
 объекты Address являются частью класса, значит и передаваться должны объекты класса, а не структуры. +что значит метод класса operator==(const MyCells& c1) const?

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


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


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

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



Цитата(Gunslinger @  16.10.2008,  14:29 Найти цитируемый пост)
 объекты Address являются частью класса, значит и передаваться должны объекты класса, а не структуры. +что значит метод класса operator==(const MyCells& c1) const?

оператор  определен для сравнения двух объектов класса Address , а что Вы ему туда передатите эта Ваша задача - для функции безразлично лишь бы было право доступа(поэрому и объявлена френдом)

Добавлено через 3 минуты и 10 секунд
Цитата(Gunslinger @  16.10.2008,  14:29 Найти цитируемый пост)
+что значит метод класса operator==(const MyCells& c1) const

оператор сравнения объекта типа класса в котором он определен с объектом типа указанного в скобках (в данном случае типы совпадают)

Добавлено через 5 минут и 13 секунд
Цитата(Gunslinger @  16.10.2008,  14:29 Найти цитируемый пост)
 'operator==' not implemented in type 'Address' for arguments of the same type

такое у Вас на код который привел bsa ?


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


Опытный
**


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

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



Цитата(mes @  16.10.2008,  14:43 Найти цитируемый пост)
такое у Вас на код который привел bsa ?
 да.
Код

struct Address {
                int x;
                int y;
                Address(){};
                Address(int my_x, int my_y);
               };
inline bool operator==(Address& a1, Address& a2)
{
 if ((a1.x==a2.x)&&(a1.y==a2.y)) return true;
 else return false;
}

class MyCells {
      private:
              Address addr;
              String Text;
       public:
                   MyCells();
                   MyCells(int x,int y,String& T): addr(0, 0), Text(T) {};
            const Address& GetAddr(){return addr;};
            const String& GetText(){return Text;};
            void SetAddr(int x,int y);
            void SetText(String& T);
            bool operator==(const MyCells& c1) const {              return (addr==c1.addr)&&(Text==c1.Text); }

};


Цитата(mes @  16.10.2008,  14:43 Найти цитируемый пост)
оператор  определен для сравнения двух объектов класса Address , а что Вы ему туда передатите

в коде:
Код

MyCells c1, c2;
//........
if(c1==c2)

Т.е. я передаю ему ссылку на адрес, по которому лежит объект класса. Далее перемещаюсь по пространству объекта в поисках структуры addr?

Это сообщение отредактировал(а) Gunslinger - 16.10.2008, 15:03
PM MAIL   Вверх
mes
Дата 16.10.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



забыто const 
Код

inline bool operator==(const Address& a1, const Address& a2);


Цитата(Gunslinger @  16.10.2008,  15:01 Найти цитируемый пост)
if(c1==c2)..

можно представить как 
if (c1.operator==(c2))..

Это сообщение отредактировал(а) mes - 16.10.2008, 15:11


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


Опытный
**


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

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



Заработало. 
Код

if(c1==c2)

строка пашет.
Только я никак не воткну в эту: 
Код
bool operator==(const MyCells& c1) const {return (addr==c1.addr)&&(Text==c1.Text); }
.
Со сравнением адресов представляю: if(struct1==struct2), но с этой... Что с чем сравнивается? Почему без нее прога не компилится? Непонятное тело: 
Код
{return (addr==c1.addr)&&(Text==c1.Text); }
. Адресная структура объекта класса с1 с равнивается со своей же адресной структурой(и текстом)?

что мне теперь править?... блин.

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


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


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

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



Цитата(Gunslinger @  16.10.2008,  15:40 Найти цитируемый пост)
bool operator==(const MyCells& c1) const {return (addr==c1.addr)&&(Text==c1.Text); }

мне кажется вы упустили что неявно передается указатель на себя, то есть код в "явном" виде выглядит так

Код

inline bool operator==(const Address& a1,const Address& a2)
{
`  return  ((a1.x==a2.x)&&(a1.y==a2.y))? true : false;
}

bool operator==(const MyCell *this, const MyCells& c1) 
{
    return (operator == (this->addr,c1.addr)  
            &&
            operator == (this->Text,c1.Text));
}


Добавлено через 1 минуту и 52 секунды
Цитата(Gunslinger @  16.10.2008,  15:40 Найти цитируемый пост)
что мне теперь править?... блин.

Цитата(Gunslinger @  16.10.2008,  15:40 Найти цитируемый пост)
Заработало. 

если заработало, то чего править?

Добавлено через 3 минуты и 31 секунду
Цитата(Gunslinger @  16.10.2008,  15:40 Найти цитируемый пост)
Почему без нее прога не компилится?

Потому что компилятор не мог догадаться как провести сравнение..


Это сообщение отредактировал(а) mes - 16.10.2008, 16:03


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


Опытный
**


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

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



Цитата(mes @  16.10.2008,  16:02 Найти цитируемый пост)
inline bool operator==(const Address& a1,const Address& a2)
{
`  return  ((a1.x==a2.x)&&(a1.y==a2.y))? true : false;
}
bool operator==(const MyCell *this, const MyCells& c1) 
{
    return (operator == (this->addr,c1.addr)  
            &&
            operator == (this->Text,c1.Text));
}

Тогда понятно!smile метод класса использует внутри себя инлайновую функцию сравнения! 
Только по вашим словам я не понял: this - он передается по умолчанию всегда (исправленный по этому коду вариант навыдавал ошибок)? Как будто читал про указатель на себя. У Рамбо вроде, что каждый объект знает, чей он или вроде того...
PM MAIL   Вверх
mes
Дата 16.10.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Gunslinger @  16.10.2008,  16:20 Найти цитируемый пост)
Только по вашим словам я не понял: this - он передается по умолчанию всегда (исправленный по этому коду вариант навыдавал ошибок)? Как будто читал про указатель на себя. У Рамбо вроде, что каждый объект знает, чей он или вроде того...

 smile  не понял о чем  Вы и чего Вы исправили..
Код приведенный в предыдущем топике нужен для понимания процесса - добавлять this к коду не нужно - это делает компилятор.

Цитата(Gunslinger @  16.10.2008,  16:20 Найти цитируемый пост)
Тогда понятно!smile метод класса использует внутри себя инлайновую функцию сравнения! 

ага, для каждого сравнения своя функция .



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0748 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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