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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #60 : Апрель 05, 2012, 11:57 »

struct SomeNumber : BaseNumber {
  virtual const SomeNumber& operator + (const BaseNumber& other) const
 }
Какой Вы умный Улыбающийся  А на что же ссылается возвращаемое SomeNumber ?
О, точно подмечено! Улыбающийся
Ссылок в сигнатуре, конечно, быть не должно.
Что, однако, никак не влияет на остальные рассуждения.  Улыбающийся
Влияет т.к. возвращая по значению мы никак не сделаем оператор (реально) виртуальным.
Записан
Tonal
Гость
« Ответ #61 : Апрель 06, 2012, 08:41 »

Ссылок в сигнатуре, конечно, быть не должно.
Что, однако, никак не влияет на остальные рассуждения.  Улыбающийся
Влияет т.к. возвращая по значению мы никак не сделаем оператор (реально) виртуальным.
И опять согласен. Улыбающийся
Причём сам же, в первом своём сообщении это учёл и написал:
Правда, в данном случае для стандартных сигнатур операторов красиво не выйдет, поэтому проще показывать на обычных функциях.
Хотя вариант сохранить сигнатуру таки есть Улыбающийся
Если к коду, приведённому в первом посте добавить оболочку:
Код:
struct AllNumber {
  const AllNumber operator + (const AllNumber& other) const {
    return AllNumber(val.get()->add(other.val.get()));
  }
  private:
    std::auto_ptr<Number> val;
};
И пользоваться только AllNumber. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Хотя вариант сохранить сигнатуру таки есть Улыбающийся
...
Код:
struct AllNumber {
  const AllNumber operator + (const AllNumber& other) const {
    return AllNumber(val.get()->add(other.val.get()));
  }
  private:
    std::auto_ptr<Number> val;
};
И пользоваться только 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,
   };
};
 
« Последнее редактирование: Апрель 06, 2012, 12:31 от Igors » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Самое правильное решение - это отказаться от такого кастыльного пути и вынести уже все операторы+ (-) и подобные бинарные операторы из класса, реализовав их по человечески в виде функций (возможно дружественных).
Тогда все ваши проблемы и потребность в этих костылях сами собой отпадут) 
Записан

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

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

Самое правильное решение
Само по себе существование такого решения в мире программирования на C++ абсурдно. Есть субъективные мнения и не более. И даже это мнение субъективно.©
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Цитировать
Само по себе существование такого решения в мире программирования на C++ абсурдно. Есть субъективные мнения и не более. И даже это мнение субъективно.©
Почитайте про шаблонное метапрограммирование, в частности про шаблоны выражений в соседней ветки: http://www.prog.org.ru/topic_21540_0.html
Как альтернатива вашему подходу, которую люди не просто так с потолка взяли и которая не на пустом месте стала очень популярным и мощным решением.
Записан

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

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

Цитировать
Само по себе существование такого решения в мире программирования на C++ абсурдно. Есть субъективные мнения и не более. И даже это мнение субъективно.©
Почитайте про шаблонное метапрограммирование, в частности про шаблоны выражений в соседней ветки: http://www.prog.org.ru/topic_21540_0.html
Как альтернатива вашему подходу, которую люди не просто так с потолка взяли и которая не на пустом месте стала очень популярным и мощным решением.
Я имел в виду, то, что в программирование вобще как в таковом очень мало случаев когда есть единственно верный вариант решения. А не то, что вы подумали и не то, куда вы меня отправили.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #67 : Апрель 06, 2012, 13:20 »

Цитировать
Само по себе существование такого решения в мире программирования на C++ абсурдно. Есть субъективные мнения и не более. И даже это мнение субъективно.©
Почитайте про шаблонное метапрограммирование, в частности про шаблоны выражений в соседней ветки: http://www.prog.org.ru/topic_21540_0.html
Как альтернатива вашему подходу, которую люди не просто так с потолка взяли и которая не на пустом месте стала очень популярным и мощным решением.
Я имел в виду, то, что в программирование вобще как в таковом очень мало случаев когда есть единственно верный вариант решения. А не то, что вы подумали и не то, куда вы меня отправили.
Я не говорю о единственно верном варианте. Я говорю, что вариант в методичке - это пример как проектировать не нужно. Это костыль, от которого можно (да, да, есть решения более изящные и гибкие) избавиться, но вам, видимо,    приятнее ходить на костылях, чем свободно передвигаться без них)
У меня ощущение, что вы всячески пытаетесь оправдать то, что с костылями ходить приятнее.. Но вы ведь даже не пробовали избавится от них.
О чём здесь ещё можно говорить?
Записан

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #68 : Апрель 06, 2012, 13:26 »

m_ax, ну Вы явно перегибаете палку. Хотим реализовать конструкцию
Код
C++ (Qt)
c = a + b;
 
Используя полиморфный механизм. Почему это плохо, кАстыльно (от слова "cast") ? Улыбающийся  Во всей Вашей уничтожающей критике я не увидел ни одного мало-мальски весомого аргумента, а Ваши альтернативные предложения звучат странно. Ввести id типа - никак не в духе полиморфизма. Вынести операторы friend - и что, как это поможет с обобщенной алгеброй? 

Возможно template здесь более подходящий подход - согласен. Ну так "в огороде бузина, а в Киеве дядька". Чем виртуалы-то плохи? Я так вижу что только одним - что-то не получилось, не удалось сделать "по известным образцам", скопировать известное решение. И все - моментально срабатывает рефлекс "костыль! велосипед! посмотри на..". Грустно  Плачущий
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #69 : Апрель 06, 2012, 13:30 »

Мне тож гручтно  Плачущий

Путь кто нить приведёт пример нормального поведения (и полиморфного в том числе) для данной постановки задачи. Основываясь на тех рекомендациях, что приведены в методичке.

Потом я приведу свой вариант и сравним)
Записан

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

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

Сообщений: 2095



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

И да, кстатии,
Цитировать
Хотим реализовать конструкцию

c = a + b;
 
Используя полиморфный механизм. Почему это плохо...
Я в курсе что мы это хотим реализовать. Именно с возможностью полиморфизма.
А плохо то, что вы пытаетесь писать костыль у которого больше минусов, чем плюсов, вместо того, что бы немного изменить архитектуру и тогда можно будет строить подобные конструкции, как используя полиморфизм:
Код
C++ (Qt)
AbstractNumber *n1 = new RealNumber(3.14);
AbstractNumber *n2 = new RealNumber(2.71);
 
*n1 = *n2 + *n1;
 

так и  использовать конструкции вида:
Код
C++ (Qt)
RealNumber n1(3.14);
RealNumber n2(2.71);
 
n1 = n2 + n1;
 
И всё это можно реализовать гораздо изящнее. И сами числа у вас, не с того не с сего, не будут менять свои значения при таких операциях.

Так что грустно, от того, что вы оправдываете  изначально кривую архитектуру.
А почему в методичке был поставлен так вопрос - это уже другая история (возможно печальная))
 
« Последнее редактирование: Апрель 06, 2012, 14:40 от m_ax » Записан

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

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

Так что грустно, от того, что вы оправдываете  изначально кривую архитектуру.
А с чего вы собственно взяли, что архитектура кривая?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #72 : Апрель 06, 2012, 21:02 »

Так что грустно, от того, что вы оправдываете  изначально кривую архитектуру.
А с чего вы собственно взяли, что архитектура кривая?
Вы что, издеваетесь надо мной? Перечитайте этот топик несколько раз)
Записан

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

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

Реализацию я переписал, числа у меня значения при арифметических операциях не меняют. Мне проще написания обращения через указатели, чем через 3 класса, т.к. обращения к арифметическим операциям у меня идут в отдельном классе и упоминаются лишь единажды в проекте. Фактически ваш вариант займет физически больше кода. Есть еще у вас варианты в пользу использования вашего метода, а не кастования типов?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #74 : Апрель 06, 2012, 21:27 »

Реализацию я переписал, числа у меня значения при арифметических операциях не меняют. Мне проще написания обращения через указатели, чем через 3 класса, т.к. обращения к арифметическим операциям у меня идут в отдельном классе и упоминаются лишь единажды в проекте. Фактически ваш вариант займет физически больше кода. Есть еще у вас варианты в пользу использования вашего метода, а не кастования типов?
Любопытно взглянуть) Не выложите исходники?
Записан

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

Arch Linux Plasma 5
Страниц: 1 ... 3 4 [5] 6   Вверх
  Печать  
 
Перейти в:  


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