Russian Qt Forum
Ноябрь 23, 2024, 20:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5 6   Вниз
  Печать  
Автор Тема: Реализация интерфейса[РЕШЕНО]  (Прочитано 46880 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Апрель 03, 2012, 10:37 »

С удивлением обнаружил что, оказывается, в методичке все правильно написано - а я был неправ!
Код
C++ (Qt)
struct CTest1 {
CTest1( void ) : mA(1) {}
virtual CTest1 & operator + ( CTest1 & src ) = 0;
virtual CTest1 & Func( void ) = 0;
 
// data
int mA;
};
 
struct CTest2 : public CTest1 {
virtual CTest2 & operator + ( CTest1 & src )
{
mA += src.mA;
return *this;
}
 
virtual CTest2 & Func( void )
{
++mA;
return *this;
}
};
 
int main(int argc, char **argv)
{
CTest2 a, b;
b = a.Func();
a = a + b;
return 0;
}
 
То есть виртуальные методы могут возвращать разные типы ссылок. Мда Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Апрель 03, 2012, 10:51 »

Как можно убедится нигде нет нужды в явном приведении типов. Улыбающийся
Да и по эффективноси, данный метод добавляет всего 1 косвенный вызов, вместо переборов перечислений или сравнений строк. Улыбающийся
Так ведь расплата за это "каждый класс знает каждого". И в данном случае он не очень к месту, т.к. не планируются смешанные операции с разнородными классами. А приемчик красивый, кстати он часто помогает "раскрутить" template 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Апрель 03, 2012, 11:16 »

Возможно слишком криво, но вполне отвечает задумке Подмигивающий
Да все нормально, только типы возврата верните взад (это я насвистел) и не забывайте после dynamic_cast проверяться на NULL

Дело вот в чем
Код
C++ (Qt)
virtual TReal &  TReal::operator + (TNumber& B);   // ну "очень странный" оператор +
virtual TReal TReal::operator + (const TNumber& B) const;  // "нормальный" оператор +
 
Первое впечатление что такой кривой оператор написал безграмотный человек Улыбающийся Но это не так. Дело в том что "нормальный" оператор мы никак не сможем уложить в виртуальный механизм т.к. он возвращает по значению. TReal & (ссылка) может быть чем-то иным, но "просто TReal" нет - это только объект типа TReal". Др словами чтобы работали виртуалы - приходится изуродовать нормальную логику операторов.

Если уж идти "до упора", то тогда так
Код
C++ (Qt)
virtual TReal & TReal::operator + (const TNumber& B) const;  
 
Это сохраняет нормальную логику +, но на что тогда указывает возвращаемая ссылка? Можно напр хранить в кольцевом буфере. Ладно, это уже "как правильно", разумеется за рамками лабы, не парьтесь
Записан
Даниил
Гость
« Ответ #33 : Апрель 03, 2012, 11:58 »

Другими словами логика правильная, нужно просто проверку делать на bad_cast? В обработку исключения не проще засунуть?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Апрель 03, 2012, 12:09 »

Другими словами логика правильная, нужно просто проверку делать на bad_cast? В обработку исключения не проще засунуть?
dynamic_cast не генерирует исключений а просто возвращает 0 если приведение невозможно. Проверяйте и вываливайтесь по нулю
Код
C++ (Qt)
pn = dynamic_cast<PNumber *>(n);
if (!pn) assert(0);    // добавьте эту строчку
 
Записан
V1KT0P
Гость
« Ответ #35 : Апрель 03, 2012, 12:12 »

Другими словами логика правильная, нужно просто проверку делать на bad_cast? В обработку исключения не проще засунуть?
dynamic_cast не генерирует исключений а просто возвращает 0 если приведение невозможно. Проверяйте и вываливайтесь по нулю
Код
C++ (Qt)
pn = dynamic_cast<PNumber *>(n);
if (!pn) assert(0);
 
Может все-таки лучше так:
Код
C++ (Qt)
assert(pn != 0);
Проще воспринимается.
Записан
Даниил
Гость
« Ответ #36 : Апрель 03, 2012, 12:24 »

dynamic_cast не генерирует исключений а просто возвращает 0 если приведение невозможно. Проверяйте и вываливайтесь по нулю
Не понял, а это тогда что? http://www.cplusplus.com/reference/std/typeinfo/bad_cast/
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Апрель 03, 2012, 12:37 »

Не понял, а это тогда что? http://www.cplusplus.com/reference/std/typeinfo/bad_cast/
Так это если приводите ссылку, а у Вас указатель. Ну в данном случае можно и ссылку приводить - дело вкуса

Может все-таки лучше так:
Код
C++ (Qt)
assert(pn != 0);
Проще воспринимается.
Согласен  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #38 : Апрель 03, 2012, 14:17 »

Цитировать
Код
C++ (Qt)
virtual TReal &  TReal::operator + (TNumber& B);   // ну "очень странный" оператор +
virtual TReal TReal::operator + (const TNumber& B) const;  // "нормальный" оператор +
 

Первое впечатление что такой кривой оператор написал безграмотный человек  Но это не так. Дело в том что "нормальный" оператор мы никак не сможем уложить в виртуальный механизм т.к. он возвращает по значению. TReal & (ссылка) может быть чем-то иным, но "просто TReal" нет - это только объект типа TReal". Др словами чтобы работали виртуалы - приходится изуродовать нормальную логику операторов.
Я об этом и говорил. И ещё у меня подозрение (не проверял), что здесь:
Код
C++ (Qt)
virtual TReal &  TReal::operator + (TNumber& B);   // ну "очень странный" оператор +
 
Изменяется и сам объект B, что кажется немного безумным)
Вы складываете два числа и одно из них (B) также меняется в результате сложения. Или оно не меняется? Тогда почему передаётся по ссылке, а не по константной ссылке?

Вобщем я считаю, что подобный выкрутас в контексте данного класса чисел, выглядит бредовым.. Имхо, можно найти решение и по изящней. 
« Последнее редактирование: Апрель 03, 2012, 14:20 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Апрель 03, 2012, 14:51 »

Изменяется и сам объект B, что кажется немного безумным)
Вы складываете два числа и одно из них (B) также меняется в результате сложения. Или оно не меняется? Тогда почему передаётся по ссылке, а не по константной ссылке?
Там и первый операнд (сам класс) меняется  - что, мягко говоря, нетипично для оператора +  Улыбающийся
И да, полное отсутствие const конечно минус авторам методички - потом очень трудно будет переучиваться, начнутся отмазки типа "та зачем, ведь и так работает"
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #40 : Апрель 03, 2012, 15:15 »

Цитировать
И да, полное отсутствие const конечно минус авторам методички - потом очень трудно будет переучиваться, начнутся отмазки типа "та зачем, ведь и так работает"
Дело даже не в том, что const, не const.. Просто им дают изначально задания из разряда - как делать не надо (в смысле как проектировать не надо), но при этом в полной уверенности что так и должно быть с точки зрения архитектуры.
А потом, при использовании таких чисел неожиданно выясняется (это в лучшем случае) что все аксиомы математики противоречат таким числам) 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #41 : Апрель 03, 2012, 16:03 »

Дело даже не в том, что const, не const.. Просто им дают изначально задания из разряда - как делать не надо (в смысле как проектировать не надо), но при этом в полной уверенности что так и должно быть с точки зрения архитектуры.
Ну хорошо, вот допустим Вы (или я) преподаватель. И что? Это одного мы сможем как-то поднатаскать (в меру наших скромных сил) - и то надо возиться с ним ого-го сколько. А что делать с группой из 20 чел (а из них любят программирование дай бог 2)? Вдаваться в нюансы архитектуры явно бесполезно. Дать одно "творческое задание" на всех? Так они перепишут друг у друга. А настаивая на "глубоком изучении" мы быстро заработаем славу препода который "выделывается" и.т.п. Улыбающийся По-любому приходится как-то упрощать, обрезать тонкости, иначе процесс образования невозможен.
Записан
Даниил
Гость
« Ответ #42 : Апрель 03, 2012, 20:13 »

Изменяется и сам объект B, что кажется немного безумным)
Как я понимаю, речь идет об отсутствии в описании метода спецификатора "const". Мне сначала показалось это ошибкой, но позже у меня возникли проблемы с кастованием константных данных. Если приведете работающий пример, буду признателен.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #43 : Апрель 03, 2012, 20:44 »

Изменяется и сам объект B, что кажется немного безумным)
Как я понимаю, речь идет об отсутствии в описании метода спецификатора "const". Мне сначала показалось это ошибкой, но позже у меня возникли проблемы с кастованием константных данных. Если приведете работающий пример, буду признателен.
Речь идёт о том, что у вас при сложении двух чисел A и B меняются  эти два числа:
C = A + B;
После такого сложения A и B изменят свои значения. Это нормально?
Как вообще такими числами пользоваться?
Суперматематика отдыхает))

Я вам уже приводил пример, но вам он не понравился(  Посмотрите на пример, который привёл Tonal
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Даниил
Гость
« Ответ #44 : Апрель 04, 2012, 06:25 »

Я вам уже приводил пример, но вам он не понравился(  Посмотрите на пример, который привёл Tonal
Ни вы, никто другой не приводил пример в котором в метод передается значение, а после приводится к другому типу.
Записан
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.408 секунд. Запросов: 23.