![]() |
|
|
![]()
|
|
| wolver17 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 15.5.2011 Репутация: 1 Всего: 1 |
Собственно, есть определённый код класса Parent и его двух дочерних public-классов Сhild1 и Сhild2. Есть виртуальная ф-ция Processing, которая рассчитывает значения трёх переменных, вводимых через компонент TEdit.
1) Вопрос, как правильно с точки зрения ООП, повестись с ф-цией Get_something, чтобы она могла обрабатывать значения полиморфной вирт. ф-ции в зависимости от того, какой x[i] определён в коде. Если подход в описании классов сделан правильно, то в идеале хотелось бы что-то вроде:
Если нет, то как переформировать описание и реализации той части класса, которую вы считаете нужным поменять? Пож. с примером. 2) можно ли описать Event метода для TRadioButton - RadioButton1Click как friend какому-либо с классов и внести описание x[i] в тело этого Event ?
|
||||||
|
|||||||
| Alexeis |
|
||||||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Это фигня называется Фабричный метод https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%...BD%D0%B8%D1%8F)
Делается это примерно таким образом. Прячем конструктор чайлдов в приват и пишем 3 функции заменяющие конструктор. По одной для каждого класса. Функция типа
Делаем функции френдами своих классов - (чтобы был доступен приватный конструктор) . После чего описываем тип функции
Нам нужно будет сохранить указатели на эти порождающие функции зарядить в ассоциативный массив std::map Описываем сам массив
Заряжаем в него все наши функции
И создаем собственно сам фабричный метод
Там, кстати на вики есть еще более простой пример на С++ без всяких STLей. Это сообщение отредактировал(а) Alexeis - 13.2.2015, 19:34 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||||||
|
|||||||||||
| wolver17 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 15.5.2011 Репутация: 1 Всего: 1 |
Что-то этот фабричный метод сложноват для восприятия... особенно если ни разу такое не далал)
Так дочерних классов 2, значит 2 констр. в приват а мейн конструктор без изменения? -------------------------------------------------------------- Пока так:
------------------------------------ на эту ф-цию с её телом - компилятор выдаёт кучу разнообразных ошибок: Parent* CreateAnyChild(std::wstring child_name, ....) {} Это сообщение отредактировал(а) wolver17 - 13.2.2015, 21:17 |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
тип должен соответствовать типу функции - конструктора CreateChildX. CreateChild1 я подразумевал что будет определена вне класса, иначе зачем ее делать friend? friend - разрешает функции, которая не является функцией класса получать доступ к private полям и функциям класса. функции класса это умеют по определению. Кроме того нельзя вызывать никакие функции класса до вызова его конструктора (кроме статических) . Пожалуй, что этот пример для вас сложноват, попробуйте пример из википедии. По той ссылке что я дал. Там пример проще. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| wolver17 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 15.5.2011 Репутация: 1 Всего: 1 |
Простите, но вы не правы: "Функция может стать другом класса, если в его описании она описана как friend." © Страуструп. К тому же я читал на одном форуме по ООП, что для френд абсолютно до лампочки куда лепить в паблик или привейт - эти права доступа не влияют на френд.
Тут вы абсолютно правы) Фабричный метод для меня сложен, попробую пересобрать код с вики под свои классы. Но возможно ваша помощь в нюансах кодинга будет нужна)) |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Я про то, что у вас тело функции определено внутри класса. Это автоматически делает функцию методом класса. Такие функции первым параметром получают указатель на экземпляр класса this, а как такое может сработать если функция должна создать экземпляр этого класса? Разве что статической объявить. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| wolver17 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 15.5.2011 Репутация: 1 Всего: 1 |
Покопался в куче инфы о фабричном методе (в книге Александреску - Современное проектирование на C++ и нескольких статьях на Хабре - фабрика объектов и фабрика фабрик) в связке с контейнером <map> + основываясь на примере Классическая реализация паттерна Factory Method попытался перефразировать свой код, приведя его к фабрике. Однако если в случае с последней ссылкой удалось переделать реализуемое там сохранение объектов в vector'e под свой map, то при попытке повторить всё на своём коде застопорилось на ошибках, решение которых я не могу найти(
Собственно код ниже:
А вот тот код, переделанный под map с сайта. В чём же ошибка, что не так описано в моей фабрике? компилятор выдаёт, если делать без параметров createParent(): [C++ Error] Unit1.cpp(129): E2285 Could not find a match for 'pair<AnsiString,Factory *>::pair(AnsiString,Parent *)' если параметризированную (как я думаю она должна быть, т.к. изначально конструктор классов был параметрическим): то выдаёт гораздо больше ошибок, на return new Child1(t_one, t_two, t_three) - что не может найти подходящий конструктор Child1::Child1(... на строчку с мап.инсерт и на что-то ещё. Короче я запутался, помогите пож.! Присоединённый файл ( Кол-во скачиваний: 1 )
Unit1.cpp 3,04 Kb |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Проще говоря строчка child1_factory->createParent() выполнит вызов функции createParent(), а нам не требуется вызова функции, а лишь сохранение ее адреса в объекте класса pair -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| wolver17 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 15.5.2011 Репутация: 1 Всего: 1 |
спс, изменил - ошибка пропала)
мне загнать
в public класса Factory или что вы имели ввиду? поясните пож. на коде...
спс за доп. коммент) |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |