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

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

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

typeid && dynamic_cast - C++

25.01.2010, 02:34. Просмотров 2080. Ответов 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)));
(говорит что константность нарушается)
и нехочет красиво форматировать (понимаю что звучит диковато, но наверняка где-то зарыта собака)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2010, 02:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос typeid && dynamic_cast (C++):

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;) - C++
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef A_H #define A_H #include &lt;string&gt; class A { ...

dynamic_cast<X&>(Y) что в результате? - C++
Попытка привести указатель на один класс к указателю на другой (несовместимый) в результате получим NULL class X{ }; class Y{ }; ...

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration? - C++
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const Rational&amp;); - invalid function declaration. ...

В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9& - C++
В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

Порядок вычисления: операторы «|» и «||», «&» и «&&» - C++
В Java булевые операторы «|» и «||», и «&amp;» и «&amp;&amp;» отличаются друг от друга порядком вычеслений, а в C++ так же как и в Java или...

4
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.01.2010, 03:24 #2
togramago, чего-то Вы тут намудрили.
Обычно операторы сравнения принимают константную ссылку на объект аналогичного класса.
Почему у Вас данный оператор принимает указатель?
Для чего это сделано?
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
25.01.2010, 09:52 #3
CyBOSSeR, см.здесь
Сравнение наследников
1
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.01.2010, 15:41 #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);
Можно будет добавлять/удалять их по необходимости, не трогая реализацию самих классов.
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
25.01.2010, 16:05 #5
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Если уж так нужна операция сравнения (с использованием указателей) - лучше использовать внешний дружественный оператор сравнения:
думаю обсуждение лучше вести в другой теме, ссылку на которую я дал постом выше.
внешний дружественный оператор сравнения не прокатывает - придётся много if/ese/dynamic_cast писать. я реализовал сравнение двух объектов через их указатели с помощью двойной диспетчеризации. более элегантного способа не придумал.
1
25.01.2010, 16:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2010, 16:05
Привет! Вот еще темы с ответами:

Friend ostream& operator<<(ostream& stream, CArr& obj); - C++
CArr.h #pragma once class CArr{ int* arr = nullptr; int size = 10; void swap(int *a, int *b); void swap(int &amp;a, int &amp;b); ...

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) - C++
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в пользовательский тип? Ведь мы заранее не можем...

Нюансы синтаксиса: где, как и для чего используется && - C++
Когда применяется ссылка на ссылку? В STL есть классы, конструкторы которых принимают ссылку на ссылку. Попробовал понять для чего они...

В программе объявлена переменная int x=1; определить значение выражения х>0 && x<1 ? 10/x : 10*x - C++
ответ уже известен, 10. Проблема в том что я не знаю каким образом он был получен.. а точнее какую функцию выполняет &quot;:&quot; здесь. просьба...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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