Russian Qt Forum
Ноябрь 26, 2024, 01:27
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Выполнить init() всем потомкам класса
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Выполнить init() всем потомкам класса (Прочитано 12342 раз)
Sahab
Гость
Re: Выполнить init() всем потомкам класса
«
Ответ #15 :
Март 09, 2012, 20:59 »
Цитировать
Если "шаблон" употреблено в широком смысле (ведь это не обязательно "template")
Именно это я и имел в виду.
Цитировать
И уж лучше велосипед (со всеми его багами) чем "вычитанная умность"
Спорно. Ко всему конечно нужно подходить с умом, однако девелопер потратит время, оплачиваемое кстати, на написание велосипеда (со всеми его багами). И не факт, что велосипед будет работать лучше и качественнее.
Цитировать
которая не проверена на себе.
А что мешает ее проверить?
Записан
Sahab
Гость
Re: Выполнить init() всем потомкам класса
«
Ответ #16 :
Март 09, 2012, 21:03 »
Взять к примеру паттерны банды четырех. Хотите сказать, что это "неправильная умность" и не нужно их использовать?
А ведь с ними можно такую жесть наворотить, если их неправильно применять.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Выполнить init() всем потомкам класса
«
Ответ #17 :
Март 09, 2012, 21:38 »
Цитата: Sahab от Март 09, 2012, 20:59
Спорно. Ко всему конечно нужно подходить с умом, однако девелопер потратит время, оплачиваемое кстати, на написание велосипеда (со всеми его багами).
Хмм.. не всегда платят "за время" иногда и "за результат" (свои плюсы-минусы)
Цитата: Sahab от Март 09, 2012, 20:59
И не факт, что велосипед будет работать лучше и качественнее.
По сравнению с чем? Откуда уверенность что есть уже готовое решение для любой задачи? Это для студентов ("как сделать правельно"), а для реальных задач... Часто кажется - ну вот же, иногда сам это уже делал. Но при ближайшем рассмотрении выплывают "детали" - которые казались мелкими/незначительными, но, оказывается, они все меняют. И вот тут с (за)Знайками большие проблемы. Сначала у них срабатывает рефлекс на "написано" (как в опытах Павлова). Невозможно отговорить такого, все, он "знает". Но потом выясняется что это "не совсем то", а еще потом - "совсем не то". Тогда начинается претензии к постановке задачи, скандалы и.т.п. Ведь "делать самому" - позорно. Увы, таков часто результат обильных знаний и обширной эрудиции.
Записан
Akon
Гость
Re: Выполнить init() всем потомкам класса
«
Ответ #18 :
Март 11, 2012, 08:31 »
ТС: Конкретно по коду, ваша ошибка заключается в том, что у шаблона класса Widget<T> функция init объявлена, но не определена. Например, если сделаете ее чисто виртуальной, ошибка будет снята.
Код:
template<typename Derived>
class Widget : public WidgetPrivate
{
...
virtual void init() = 0;
...
}
Я так понимаю, вы хотите сделать т.н. "статический полиморфизм" для вызовов функций приватного класса, в частности, init(). Тогда зачем эта функция виртуальная? Ваш код мне не совсем понятен - в чем смысл приватного класса, если от него идет открытое наследование? Где в коде вызывается init()?. Просьба, опишите задачу более подробно.
Записан
ecspertiza
Супер
Offline
Сообщений: 1053
С уважением, мастер конфетного цеха!
Re: Выполнить init() всем потомкам класса
«
Ответ #19 :
Март 11, 2012, 09:05 »
Должен быть примерно след. шаблон
http://liveworkspace.org/code/e679e6c4df8079a5303dce4c027d048a
приватный класс который есть в коде сделан только за счет того что классы с Q_OBJECT не поддерживают работу с шаблонами, а так как всетаки нужны сигналы и слоты пришлось извратиться написав приватный класс. Вопрос на самом деле уже решен, только из топика половина ответов прибито. В аттач выложу последний рабочий код. А задача стояла в том что бы под разными платформами рисовать разный интерфейс под маком нативный под виндой и линухом декларатив.
Записан
Akon
Гость
Re: Выполнить init() всем потомкам класса
«
Ответ #20 :
Март 11, 2012, 10:20 »
Приведенный по ссылке шаблон (как есть) нерабочий в принципе, в смысле не соответствует задуманному. Вызов виртуального метода из конструктора - только не для С++! Желаемого поведения можно добиться, в частности, с помощью CRTP (одну из форм вы привели выше), но это потенциально бажный путь, поскольку наследник в общем случае не будет полностью создан. В С++ такая задача решается выделением полиморфного функционала в отдельный класс и использованием стратегии (паттерн).
Цитировать
А задача стояла в том что бы под разными платформами рисовать разный интерфейс под маком нативный под виндой и линухом декларатив.
Ну, типичная задача. А чем не устраивает подход, используемый в Qt (бридж)? Что в вашем случае дают шаблоны - элегантность, гибкость, меньший набор исходного кода, быстродействие?
Записан
ecspertiza
Супер
Offline
Сообщений: 1053
С уважением, мастер конфетного цеха!
Re: Выполнить init() всем потомкам класса
«
Ответ #21 :
Март 11, 2012, 10:25 »
Наверное не совсем представляю что за Qt (бридж) поэтому и решил сделат как есть. Если можно пример буду рад
Записан
Akon
Гость
Re: Выполнить init() всем потомкам класса
«
Ответ #22 :
Март 11, 2012, 10:48 »
Мост (Bridge) - широко используемый паттерн (описан в банде четырех), когда необходим единый интерфейс (паблик класс) для нескольких реализаций (приватный класс). Для примеров см. сорцы Qt, например, qwidget*.
Записан
ecspertiza
Супер
Offline
Сообщений: 1053
С уважением, мастер конфетного цеха!
Re: Выполнить init() всем потомкам класса
«
Ответ #23 :
Март 11, 2012, 10:48 »
Спасибо, гляну этот паттерн
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Выполнить init() всем потомкам класса
«
Ответ #24 :
Март 11, 2012, 11:15 »
Неясно как в данном случае должен выглядеть этот мост, и не натолкнется ли он на проблемы с QObject и/или делегирование окажется слишком массивным. Вообще непонятно почему нельзя отделаться #ifdef ?
Записан
ecspertiza
Супер
Offline
Сообщений: 1053
С уважением, мастер конфетного цеха!
Re: Выполнить init() всем потомкам класса
«
Ответ #25 :
Март 11, 2012, 11:17 »
можно отделаться #ifdef , только придется в каждом виджете это проверять, а так проверка происходит только в одном месте
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...