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

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

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

Сообщений: 2095



Просмотр профиля
« Ответ #45 : Апрель 04, 2012, 09:31 »

Я вам уже приводил пример, но вам он не понравился(  Посмотрите на пример, который привёл Tonal
Ни вы, никто другой не приводил пример в котором в метод передается значение, а после приводится к другому типу.
И правильно сделали, что не стали приводить заведомо костыльные решения)

Смотрите: Кода в классе (абстрактном) пишут подобные объявления оператора+
Код
C++ (Qt)
class TANumber
{
public:
   virtual ~Number() {}
   virtual TANumber& operator+(TANumber&) = 0;
//...
};
 
Возникает подозрение, что у автора либо проблемы с математикой, либо непонимание в прегрузки операторов. Либо и то и другое)
Причём, класс реализует число и, соответственно, все операции с этими числами не должны противоречить математике.
Но вам в вашей методичке явно указывают как вы должны делать. Так вот так делать как раз не надо)
Это костыльный безграмотный вариант.
Или ещё не очевидно почему это так?

   
Записан

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

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

Как можно убедится нигде нет нужды в явном приведении типов. Улыбающийся
Да и по эффективноси, данный метод добавляет всего 1 косвенный вызов, вместо переборов перечислений или сравнений строк. Улыбающийся
Так ведь расплата за это "каждый класс знает каждого".
Ну а когда ты явно кастишь dynamic_cast-ом ты типы не знаешь? Улыбающийся
Хотя это действительно ограничение данного метода - при добавлении нового класса нужно добавлять функции его обработки во все классы.
Иногда это можно ослабить с помощью наследования...

И в данном случае он не очень к месту, т.к. не планируются смешанные операции с разнородными классами.
Перечитал стартовый топик.
ИМХО, задание как раз было на использование dynamic_cast либо сравнение type_info. Улыбающийся

Решения с перечислениями вполне аналогичны двойной диспетчеризации - и там и там нужно предварительно объявить состав производных классов.
Причём решение с перечисленим хуже - т. к. не практически не проверяется компилятором.

Да, нет нужды в смешанных операциях, то с добавлением нового класса меняется сигнатура только базового объекта:
Код
C
struct SomeNumber;
 
struct BaseNumber {
 virtual const BaseNumber& operator + (const BaseNumber&) const = 0;
 protected:
   virtual const BaseNumber& add_to(const BaseNumber&) const {throw std::bad_cast();}
   virtual const SomeNumber& add_to(const SomeNumber&) const = 0;
};
struct SomeNumber : BaseNumber {
 virtual const SomeNumber& operator + (const BaseNumber& other) const {
   return other.add_to(*this);
 }
 protected:
   virtual const SomeNumber& add_to(const SomeNumber&) const;
};
 
А приемчик красивый, кстати он часто помогает "раскрутить" template
В шаблонах как раз полиморфизм по всем параметрам. Так что там в этом приёмчике смысла большого нет. Улыбающийся

П. С. Да, в С++ разрешеатся в переопределённом виртуальном методе возвращать указатель/ссылку производного типа, а не того, который был объявлен в предке.
Так что оператор в примере выше действительно виртуальный.
Записан
Даниил
Гость
« Ответ #47 : Апрель 04, 2012, 10:35 »

Я вам уже приводил пример, но вам он не понравился(  Посмотрите на пример, который привёл Tonal
Ни вы, никто другой не приводил пример в котором в метод передается значение, а после приводится к другому типу.
И правильно сделали, что не стали приводить заведомо костыльные решения)

Смотрите: Кода в классе (абстрактном) пишут подобные объявления оператора+
Код
C++ (Qt)
class TANumber
{
public:
   virtual ~Number() {}
   virtual TANumber& operator+(TANumber&) = 0;
//...
};
 
Возникает подозрение, что у автора либо проблемы с математикой, либо непонимание в прегрузки операторов. Либо и то и другое)
Причём, класс реализует число и, соответственно, все операции с этими числами не должны противоречить математике.
Но вам в вашей методичке явно указывают как вы должны делать. Так вот так делать как раз не надо)
Это костыльный безграмотный вариант.
Или ещё не очевидно почему это так?

   
Я все понял, а вы очевидно не читаете мои сообщения, а рассуждаете наедине с самим собой. Я не спрашиваю вас как решить мою задачу. Это я уже понял сам. Я спросил вполне конкретный вопрос.
Цитировать

... у меня возникли проблемы с кастованием константных данных. Если приведете работающий пример, буду признателен.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Цитировать
Я все понял, а вы очевидно не читаете мои сообщения, а рассуждаете наедине с самим собой. Я не спрашиваю вас как решить мою задачу. Это я уже понял сам. Я спросил вполне конкретный вопрос.

Цитировать
... у меня возникли проблемы с кастованием константных данных. Если приведете работающий пример, буду признателен.
А вы мои читаете?
В вашем варианте (тот что в методичке) сделать каст по константной ссылке не получится. Угадайте почему)
И как следствие при операциях сложения, вычитания и пр. у вас автоматически будут меняться сами числа, участвующие в данных операциях.
Осмыслите то, что вы делаете, а не слепо следуйте сомнительным указаниям)   
Записан

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

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

Есть такие ситуации в нашей жизни, когда нужно сделать так, как говорят другие люди, т.к. за ваш труд платят они и вам лучше плюнуть на свою гордость ...
Но, что-то мы немного отвлеклись. Всем спасибо за участие в обсуждение, вы все мне помогли осмыслить новые приемы в программирование на C++.
Спасибо, m_ax.
Спасибо, Tonal.
Спасибо, Igors.
Спасибо, V1KT0P.
Спасибо, Пантер (он кстати первым выдвинул корректную идею  Показает язык).
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Цитировать
Есть такие ситуации в нашей жизни, когда нужно сделать так, как говорят другие люди, т.к. за ваш труд платят они и вам лучше плюнуть на свою гордость ...
Да, есть такие ситуации, кто же спорит..
Только вот сейчас это вы платите за такие решения и за такое образование.. 
Записан

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

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

Сообщений: 11445


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

struct SomeNumber : BaseNumber {
  virtual const SomeNumber& operator + (const BaseNumber& other) const
 }
Какой Вы умный Улыбающийся  А на что же ссылается возвращаемое SomeNumber ?

Даниил, не обращайте внимания, Ваша лаба (давно) ни при чем, это мы о том "как правильно"  Улыбающийся
Записан
Даниил
Гость
« Ответ #52 : Апрель 04, 2012, 17:02 »

Вобщем, я пока так решил сделать, по вашим советам через касты:
Код
C++ (Qt)
class Number
{
   /* ... ... ... */
public:
   virtual Number& operator =(Number &n) = 0;
   virtual Number& operator +(Number &n) = 0;
   /* ... ... ... */
};
 
class PNumber : public Number
{
   /* ... ... ... */
   Number& operator =(Number &p1);
   Number& operator +(Number &p1);
   /* ... ... ... */
};
 
Number& PNumber::operator +(PNumber &p1)
{
   PNumber *pn;
   Number *n = &p1;
   pn = dynamic_cast<PNumber *>(n);
   pn->number += this->number;
   return *pn;
}
 
Возможно слишком криво, но вполне отвечает задумке Подмигивающий
Что ж вы за люди такие, могли ж конкретно носом ткнуть, что изменяю второй операнд  Плачущий Только сейчас нашел ...
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #53 : Апрель 04, 2012, 17:08 »

Цитировать
Что ж вы за люди такие, могли ж конкретно носом ткнуть, что изменяю второй операнд   Только сейчас нашел ...
Уж какие есть) Хотя я об этом вам уже неоднократно писал. Но вы, видимо, не обращаете на это внимания.. Что ж вы за человек такой))

Уверяю вас, вы ещё много костылей найдёте, если будете придерживаться той схемы, что предложена вам в той методичке..   
Записан

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

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

Оригинальный у вас метод помощи, т.е. если к вам подбежит человек, у которого сломана рука, вы отправите его в магазин за книгой? (естественно вы будете точно знать, что книга там про переломы есть)
Я к тому, что можно было написать конкретно: "В вашем варианте, происходит изменения передаваемого по ссылке объекта".
А не отправлять думать над архитектурой программы, ссылаюсь на некоторые возможные проблемы :\

*Сломанной ногой, с рукой сломанной ходить можно ... а тут явный баг будет =]
« Последнее редактирование: Апрель 04, 2012, 17:18 от Даниил » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #55 : Апрель 04, 2012, 17:20 »

Оригинальный у вас метод помощи, т.е. если к вам подбежит человек, у которого сломана рука, вы отправите его в магазин за книгой? (естественно вы будете точно знать, что книга там про переломы есть)
Я к тому, что можно было написать конкретно: "В вашем варианте, происходит изменения передаваемого по ссылке объекта".
А не отправлять думать над архитектурой программы, ссылаюсь на некоторые возможные проблемы :\

Перечитайте, пожалуйста повнимательнее мой пост № 38, № 43 и № 48
Записан

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

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

Действительно, нашел. Ну очень осторожный совет. Да, был не прав. Извиняюсь.
Но думаю, в след. раз вам не помешало бы более конкретно выражать ваши мысли.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #57 : Апрель 04, 2012, 17:25 »

Что ж вы за люди такие, могли ж конкретно носом ткнуть, что изменяю второй операнд  Плачущий Только сейчас нашел ...
Так написано же так
Код
C++ (Qt)
Number& PNumber::operator +(PNumber &p1)
 
p1 константная ссылка? Нет - ну значит этот оператор его будет менять. Забили на const - получайте
Записан
Даниил
Гость
« Ответ #58 : Апрель 04, 2012, 17:31 »

Забили на const - получайте
Не "забили", а не использовали, в виду либо невозможности, либо неопытности.
Записан
Tonal
Гость
« Ответ #59 : Апрель 05, 2012, 11:43 »

struct SomeNumber : BaseNumber {
  virtual const SomeNumber& operator + (const BaseNumber& other) const
 }
Какой Вы умный Улыбающийся  А на что же ссылается возвращаемое SomeNumber ?
О, точно подмечено! Улыбающийся Видимо по этому до сих пор и не богатый.
Ссылок в сигнатуре, конечно, быть не должно.
Что, однако, никак не влияет на остальные рассуждения. Улыбающийся
Записан
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


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