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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Выполнить init() всем потомкам класса  (Прочитано 12245 раз)
Sahab
Гость
« Ответ #15 : Март 09, 2012, 20:59 »

Цитировать
Если "шаблон" употреблено в широком смысле (ведь это не обязательно "template")
Именно это я и имел в виду.

Цитировать
И уж лучше велосипед (со всеми его багами) чем "вычитанная умность"
Спорно. Ко всему конечно нужно подходить с умом, однако девелопер потратит время, оплачиваемое кстати, на написание велосипеда (со всеми его багами). И не факт, что велосипед будет работать лучше и качественнее.

Цитировать
которая не проверена на себе.
А что мешает ее проверить?
Записан
Sahab
Гость
« Ответ #16 : Март 09, 2012, 21:03 »

Взять к примеру паттерны банды четырех. Хотите сказать, что это "неправильная умность" и не нужно их использовать?
А ведь с ними можно такую жесть наворотить, если их неправильно применять.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Март 09, 2012, 21:38 »

Спорно. Ко всему конечно нужно подходить с умом, однако девелопер потратит время, оплачиваемое кстати, на написание велосипеда (со всеми его багами).
Хмм.. не всегда платят "за время" иногда и "за результат" (свои плюсы-минусы)

И не факт, что велосипед будет работать лучше и качественнее.
По сравнению с чем? Откуда уверенность что есть уже готовое решение для любой задачи? Это для студентов ("как сделать правельно"), а для реальных задач... Часто кажется - ну вот же, иногда сам это уже делал. Но при ближайшем рассмотрении выплывают "детали" - которые казались мелкими/незначительными, но, оказывается, они все меняют. И вот тут с (за)Знайками большие проблемы. Сначала у них срабатывает рефлекс на "написано" (как в опытах Павлова). Невозможно отговорить такого, все, он "знает". Но потом выясняется что это "не совсем то", а еще потом - "совсем не то". Тогда начинается претензии к постановке задачи, скандалы и.т.п. Ведь "делать самому" - позорно.  Увы, таков часто результат обильных знаний и обширной эрудиции.

Записан
Akon
Гость
« Ответ #18 : Март 11, 2012, 08:31 »

ТС: Конкретно по коду, ваша ошибка заключается в том, что у шаблона класса Widget<T> функция init объявлена, но не определена. Например, если сделаете ее чисто виртуальной, ошибка будет снята.
Код:
template<typename Derived>
class Widget : public WidgetPrivate
{
...
virtual void init() = 0;
...
}

Я так понимаю, вы хотите сделать т.н. "статический полиморфизм" для вызовов функций приватного класса, в частности, init(). Тогда зачем эта функция виртуальная? Ваш код мне не совсем понятен - в чем смысл приватного класса, если от него идет открытое наследование? Где в коде вызывается init()?. Просьба, опишите задачу более подробно.
 
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #19 : Март 11, 2012, 09:05 »

Должен быть примерно след. шаблон http://liveworkspace.org/code/e679e6c4df8079a5303dce4c027d048a приватный класс который есть в коде сделан только за счет того что классы с Q_OBJECT не поддерживают работу с шаблонами, а так как всетаки нужны сигналы и слоты пришлось извратиться написав приватный класс. Вопрос на самом деле уже решен, только из топика половина ответов прибито. В аттач выложу последний рабочий код. А задача стояла в том что бы под разными платформами рисовать разный интерфейс под маком нативный под виндой и линухом декларатив.
Записан
Akon
Гость
« Ответ #20 : Март 11, 2012, 10:20 »

Приведенный по ссылке шаблон (как есть) нерабочий в принципе, в смысле не соответствует задуманному. Вызов виртуального метода из конструктора - только не для С++! Желаемого поведения можно добиться, в частности, с помощью CRTP (одну из форм вы привели выше), но это потенциально бажный путь, поскольку наследник в общем случае не будет полностью создан. В С++ такая задача решается выделением полиморфного функционала в отдельный класс и использованием стратегии (паттерн).

Цитировать
А задача стояла в том что бы под разными платформами рисовать разный интерфейс под маком нативный под виндой и линухом декларатив.
Ну, типичная задача. А чем не устраивает подход, используемый в Qt (бридж)? Что в вашем случае дают шаблоны - элегантность, гибкость, меньший набор исходного кода, быстродействие?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #21 : Март 11, 2012, 10:25 »

Наверное не совсем представляю что за Qt (бридж) поэтому и решил сделат как есть. Если можно пример буду рад
Записан
Akon
Гость
« Ответ #22 : Март 11, 2012, 10:48 »

Мост (Bridge) - широко используемый паттерн (описан в банде четырех), когда необходим единый интерфейс (паблик класс) для нескольких реализаций (приватный класс). Для примеров см. сорцы Qt, например, qwidget*.

Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #23 : Март 11, 2012, 10:48 »

Спасибо, гляну этот паттерн
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Март 11, 2012, 11:15 »

Неясно как в данном случае должен выглядеть этот мост, и не натолкнется ли он на проблемы с QObject и/или делегирование окажется слишком массивным. Вообще непонятно почему нельзя отделаться #ifdef ?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #25 : Март 11, 2012, 11:17 »

можно отделаться #ifdef , только придется в каждом виджете это проверять, а так проверка происходит только в одном месте Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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