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

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

Страниц: 1 ... 4 5 [6]   Вниз
  Печать  
Автор Тема: Реализация интерфейса[РЕШЕНО]  (Прочитано 46317 раз)
Даниил
Гость
« Ответ #75 : Апрель 06, 2012, 22:11 »

Да, конечно. Вот, в первозданном виде.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #76 : Апрель 06, 2012, 22:42 »

Да, конечно. Вот, в первозданном виде.
Поздравляю, Даниил! Вы действительно (худо-бедно) избавились от проблемы изменения чисел при мат. операциях над ними.
Вот только приобрели другую проблему... Даже и не знаю, какая из них страшней...
Записан

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

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

Сообщений: 11445


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

А с чего вы собственно взяли, что архитектура кривая?
Ну вообще-то кривая Улыбающийся Это называется "мнимая общность". Неск классов наследуются от Number, и это можно как-то оправдать, мол, "все эти классы - числа". Но если посмотреть а что же общего у этих классов - то выясняется что аж ничего. Нет ни одного метода который общий и имеет смысл напр как для PNumber так и для ComplexNumber. "Все они имеют оператор +", ну так в Assistant есть десятки (или больше) классов с таким оператором, но на этом основании они не наследуются от одного базового.

Но не стоит это воспринимать так трагически как делает m_ax  Улыбающийся Это просто учебный пример, вполне возможен случай когда классы действительно имеют достаточно общего, виртуалов и сделать еще и операторы виртуальными может быть вполне разумно.

Да, конечно. Вот, в первозданном виде.
Ой  Улыбающийся  Так у Вас "течет" память. Если оператор вернул класс по значению, то он автоматычно удалится когда станет ненужным. Но если оператор вернет ссылку - удалять ее никто не будет, и память (которую Вы выделили через new) не будет освобождена.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #78 : Апрель 07, 2012, 14:10 »

Цитировать
Но не стоит это воспринимать так трагически как делает m_ax   Это просто учебный пример, вполне возможен случай когда классы действительно имеют достаточно общего, виртуалов и сделать еще и операторы виртуальными может быть вполне разумно.
Улыбающийся Нет, я не драматизирую)
Кривость архитектуры здесь не в том, что они наследуются от "мнимой общности".. Фиг с ней, пусть наследуются - это как раз и даст им возможность полиморфизма.
Дело то в другом. Они пытаются забивать гвозди утюгом, в уверенности, что утюг для этого и создан.
Уже сам факт того, как они объявляют операторы+ - и др:
Код
C++ (Qt)
class Number
{
public:
// ...
   virtual Number& operator +(Number &n) = 0;
   virtual Number& operator -(Number &n) = 0;
   virtual Number& operator /(Number &n) = 0;
   virtual Number& operator *(Number &n) = 0;
//...  
};
 
говорит о том, что у автора в голове полное не понимание основ перегрузки операторов.. И авторитетность таких людей, которые ещё преподают c++, у меня под большим-большим сомнением.
В этом и проблема)
Записан

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #79 : Апрель 07, 2012, 14:29 »

говорит о том, что у автора в голове полное не понимание основ перегрузки операторов.. И авторитетность таких людей, которые ещё преподают c++, у меня под большим-большим сомнением.
В этом и проблема)
Как легко критиковать других Улыбающийся Но такая критика только сваливает тему во флуд - и ничего больше
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #80 : Апрель 07, 2012, 14:47 »

говорит о том, что у автора в голове полное не понимание основ перегрузки операторов.. И авторитетность таких людей, которые ещё преподают c++, у меня под большим-большим сомнением.
В этом и проблема)
Как легко критиковать других Улыбающийся Но такая критика только сваливает тему во флуд - и ничего больше
Нееет, мухи отдельно - котлеты отдельно)
Одно дело, когда такие архитектурные решения, в процессе обучения вояет сам обучающийся (что вполне нормально: все мы учимся на ошибках), а другое, когда такие решения навязывают, выдавая за правильные, преподы.
Так вот потихоньку и разваливается наше классическое образование.. Вы меня понимаете?   
Записан

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

Arch Linux Plasma 5
Даниил
Гость
« Ответ #81 : Апрель 07, 2012, 15:03 »

Так вот потихоньку и разваливается наше классическое образование.. Вы меня понимаете?   
Милости просим в министерство образования с инновационными идеями.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Так вот потихоньку и разваливается наше классическое образование.. Вы меня понимаете?   
Милости просим в министерство образования с инновационными идеями.
Вообще то, вы в этом должны быть больше заинтересованы, не находите?
Записан

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

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

Сообщений: 11445


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

Так вот потихоньку и разваливается наше классическое образование..
При всем желании никак не могу назвать свое образование классическим. Нет, ну формально я программирование изучал, но тогда рулили транзисторы и операционные усилители, а этот курс АЯиП никаким авторитетом не пользовался. Лектор был рыжий и один раз даже пришел на лекцию с яйцами (в смысле с лотком), всякому было ясно что программист - женщина и скоро уйдет в декрет.

Так что по сравнению с тем что было - не так уж плохо, чего Вы напустились? И вообще - хватит порожняк гонять с учебным примером,  для Вас есть напр такое

http://www.prog.org.ru/index.php?topic=21481.msg148890#msg148890

А то повыучивали тут паттерны всякие..
Записан
Даниил
Гость
« Ответ #84 : Апрель 07, 2012, 18:18 »

Вообще то, вы в этом должны быть больше заинтересованы, не находите?
Дабы вы успокоились, скажу вам, что преподаватель выразил такую же идею - что именно перегружать операторы (+,-, /,*) не самая лучшая идея для данного решения. Но задумка была именно в dynamic_cast и кривизна решения тут мера необходимая. Просто для того, чтобы студенты думали головой и пытались найти лучшее решение в проигранной ситуации.
А так да, он всерьез задумался о том, чтобы переписать методички.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #85 : Апрель 07, 2012, 18:34 »

Вообще то, вы в этом должны быть больше заинтересованы, не находите?
Дабы вы успокоились, скажу вам, что преподаватель выразил такую же идею - что именно перегружать операторы (+,-, /,*) не самая лучшая идея для данного решения. Но задумка была именно в dynamic_cast и кривизна решения тут мера необходимая. Просто для того, чтобы студенты думали головой и пытались найти лучшее решение в проигранной ситуации.
А так да, он всерьез задумался о том, чтобы переписать методички.
Идея тут не столько в dynamic_cast, а в том, чтобы на примере чисел продемонстрировать полиморфное поведение.
И этого эффекта можно добиться. И будет у вас возможность делать, например так:
Код
C++ (Qt)
Number *n1 = new TANumber;
Number *n2 = new TANumber;
 
*n1 = *n1 + *n2;
*n1 = *n1 - *n2;
*n1 = (*n1) * (*n2);
// ...
// и даже так:
TANumber n1;
TANumber n2;
 
n1 = n1 + n2;
n1 = n1 - n2;
// ...
 
 
Просто нужно вынести операторы + - * / из класса, а не пытаться делать их его членами.

ЗЫ Ну вы меня успокоили) Преподу привет от Russia Qt Forum)
ЗЫЗЫ Мы следим за качеством методичек  Крутой
Записан

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

Arch Linux Plasma 5
Tonal
Гость
« Ответ #86 : Апрель 09, 2012, 08:31 »

...
И пользоваться только AllNumber. Улыбающийся
Ну "пользоваться только" - это несолидно.
ИМХО, в программировании нет аргумента «несолидно».
Есть лучше/хуже соответствует задаче, например. Улыбающийся

А почему не так
Код
C++ (Qt)
struct CFractNumber : public CBaseNumber {
 CFractNumber & operator + (const CBaseNumber & other) const
 {
   assert(dynamoc_cast <const CFactNumber *> &other) != 0);
   CFractNumber & result = mBuf[mBufCount];
   result = *this;
   mBufCount = (mBufCount + 1) % BUF_SIZE;
   return result += other;
 }
 
 private:
   static int mBufCount = 0;
   static CFractNumber mBuf[BUF_SIZE];
 
   enum {
     BUF_SIZE = 256,
   };
};
 
Потому что не контролируется переполнение Улыбающийся
Код
C++ (Qt)
CFractNumber fun1(const CFractNumber& init, int cnt) {
 CFractNumber& res = init + init;
 for (int i = 0; i < cnt - 1; ++i)
   res = res + init;
 return res;
}
// или чуть подругому:
CFractNumber fun2(const CFractNumber& init, int cnt) {
 const CFractNumber& first = init + init;
 CFractNumber res = first;
 for (int i = 0; i < cnt - 1; ++i)
   res = res + init + first;
 return res;
}
//И где-то в коде:
CFractNumber b = fun1(a, 1000);
CFractNumber d = fun2(c, 1000);
 
По сути отличается от моего кода только распределением памяти и контролем за ней.
Ежели можешь рассчитать верхний предел одновременного количества временных объектов, и приделать гарантию, что они не пересекутся, то можно и так. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #87 : Апрель 09, 2012, 08:57 »

Потому что не контролируется переполнение Улыбающийся
То да, и возвращение константной ссылки не спасает. Причем не видно даже как отловить - ведь деструктор не будет вызван если вернули ссылку. Ну ладно, все имеет минусы
Записан
Страниц: 1 ... 4 5 [6]   Вверх
  Печать  
 
Перейти в:  


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