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

С++ для начинающих

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

typeid && dynamic_cast - C++

25.01.2010, 02:34. Просмотров 2055. Ответов 4
Метки нет (Все метки)

Здравствуйте!

а можно ли вот так написать?
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
Посмотрите здесь:

C++ Где используются логические операторы && и ||
dynamic_cast<X&>(Y) что в результате? C++
C++ Изменение формата данных && работа с файлом
C++ Классы && С++ Отложение объявление на потом
Указатели(Какую роль выполняют &* и *&) C++
C++ Очистка потока ввода && строки
C++ Чем оператор || отличается от оператора && ?
[struct tm] или нестыковка в C89 & C++98 & C++11? C++
Nested classes && enum declaration C++
C++ Логические операции (Логические &&, ||) (Побитовые &, |)
C++ Напишите цикл, эквивалентный приведенному выше циклу, не пользуясь операторами && и ||
C++ Strcpy_s выдает ошибку L Buffer is too small & & 0

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.01.2010, 03:24     typeid && dynamic_cast #2
togramago, чего-то Вы тут намудрили.
Обычно операторы сравнения принимают константную ссылку на объект аналогичного класса.
Почему у Вас данный оператор принимает указатель?
Для чего это сделано?
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
25.01.2010, 09:52     typeid && dynamic_cast #3
CyBOSSeR, см.здесь
Сравнение наследников
CyBOSSeR
Эксперт C++
2299 / 1669 / 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
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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru