Форум программистов, компьютерный форум CyberForum.ru

typeid && dynamic_cast - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
togramago
9 / 9 / 0
Регистрация: 03.11.2009
Сообщений: 39
25.01.2010, 02:34     typeid && dynamic_cast #1
Здравствуйте!

а можно ли вот так написать?
C++
1
2
3
4
5
6
bool Item::operator==(Ware * w) const
{
    if (typeid(*w) == typeid(*this))
                return (*this == (*dynamic_cast<Item*> (w)));
            return false;
        }
где Item - класс насследник Ware

у меня компилятор ругаетсчя на
C++
1
return (*this == (*dynamic_cast<Item*> (w)));
(говорит что константность нарушается)
и нехочет красиво форматировать (понимаю что звучит диковато, но наверняка где-то зарыта собака)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2010, 02:34     typeid && dynamic_cast
Посмотрите здесь:

Проблема с проверкой условия цикла for( int i=2; !((n%i||d%i)&&!(n%i&&d%i))==0 ; i++) C++
dynamic_cast<X&>(Y) что в результате? C++
В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9& C++
C++ Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.01.2010, 03:24     typeid && dynamic_cast #2
togramago, чего-то Вы тут намудрили.
Обычно операторы сравнения принимают константную ссылку на объект аналогичного класса.
Почему у Вас данный оператор принимает указатель?
Для чего это сделано?
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
25.01.2010, 09:52     typeid && dynamic_cast #3
CyBOSSeR, см.здесь
Сравнение наследников
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.01.2010, 15:41     typeid && dynamic_cast #4
zim22, дело в другом.

Просто, если бы я увидел запись вида:
C++
1
2
3
4
SomeClass sc1;
SomeClass sc2;
 
bool equal = sc1 == &sc2; // получается, что мы сравниваем экземпляр объекта с указателем
у меня бы появились сильные сомнения в здравомыслии человека, который это написал, ибо сравнивать экземпляр класса с указателем на данный класс, это как минимум весьма необычная операция.

Если уж так нужна операция сравнения (с использованием указателей) - лучше использовать внешний дружественный оператор сравнения:
C++
1
bool operator==(const SomeClass* left, const SomeClass* right);
Можно будет добавлять/удалять их по необходимости, не трогая реализацию самих классов.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
25.01.2010, 16:05     typeid && dynamic_cast #5
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Если уж так нужна операция сравнения (с использованием указателей) - лучше использовать внешний дружественный оператор сравнения:
думаю обсуждение лучше вести в другой теме, ссылку на которую я дал постом выше.
внешний дружественный оператор сравнения не прокатывает - придётся много if/ese/dynamic_cast писать. я реализовал сравнение двух объектов через их указатели с помощью двойной диспетчеризации. более элегантного способа не придумал.
Yandex
Объявления
25.01.2010, 16:05     typeid && dynamic_cast
Ответ Создать тему
Опции темы

Текущее время: 08:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru