![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
fear |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
Есть абстрактный класс A. У него два класса потомка B и C, с переопределёнными ф-циями базового класса.
Так же ещё есть класс H, которому нужно пользоваться либо объектами класса В либо С. Выбор каким классом объекта пользоваться определяется один единственный раз при создании объекта H (допустим его конструктору передаётся параметр, определяющий какой класс использовать В или С). Как реализовать класс H, чтобы он работал исходя из приведённого выше? Можно конечно сделать элементом класса H, указатель на объект класса А, в конструктор класса H добавив что-то типа
где msg это A::msg Хотелось бы вообщем услышать какой нибуть другой способ, позволяющий создавать объекты класса В или С в H не зная с чем именно мы будем работать. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Если ты имел в виду A* msg; то это и есть самый нормальный способ, для того полиморфизм и придуман. Более гибко создавать классы где-то в другом месте и передавать H уже готовый указатель на A. Во первых, классов может стать больше и bool не обойдещься. Во вторых, лучше Р избавить от лишних знаний об конкретных классах B и C. Н ведь все равно только интерфейсом A может пользоваться. -------------------- ... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Абстрактная фабрика тебе поможет
теперь H ничего не будет знать об реализациях A, вопросами создания конкретных объектов (B, C, ...) будут заниматься реализации abstract_factory -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
fear |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
Дело в том что пользователь должен работать только с классом H, при этом про A,B,C он ничего не знает.
Говоря предметнее, класс А представляет собой сообщение, В - сообщение в формате 1, С - в формате 2. Пользователь знает лишь с каким форматом сообщения ему работать и методы класса H, при этом он не догадывается что в сообщении. Объекты класса В или С в идеале должны создаваться в методах класса H. Как бы так создавать объекты В или С в Н, не создавая H::A *msg? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Тогда пусть конструктор H получает информацию о формате сообщения (скажем, код) и передает этот код фабрике, запрашивая объект. Фабрика может где жить как синглетон.
Можно даже вместо объекта-фабрики использовать глобальную ф-ю:
Ну и конечно лучше какие-нибудь умные указатели использовать всето встроенных... -------------------- ... |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ты сам себе противоречишь
и сразу
т е H про B C не знает но их создает ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |