![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
dAnIK SeNT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.2.2003 Где: Казань Репутация: нет Всего: нет |
Дано:
класс base_class. производные от него классы child_xxxxxx где xxxxx - чего-нибудь. например child_first child_second child_third функция типа base_class *create_object(char *obj_type) { } obj_type - это как раз содержимое ххх, т.е. напрмер вызываем: base_class *bc = create_object("first"); такой вызов должен создать объект типа child_first и вернуть указатель на него. это вообще реально? |
|||
|
||||
acp |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 389 Регистрация: 4.2.2003 Где: Владимир Репутация: нет Всего: 2 |
Как следует из понимания ООП, то родителю можно присваивать потомка. Но в вышенаписанном тобой случае, по всей видимости, тебе функция всё время будет возвращать родителя, а никак не потомка. Тут возможны два решения 1. или перегрузка функций 2. или void* (вроде так) |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
acp, а где ты функцию увидел, человек только её определение привёл. Не известно что это функция делает.
dAnIK SeNT, поищи какое-нибудь другое решение. Так как-то странно получается. Но это возможно за одним "но". Нельзя получив char* добавить вначале "child_" и создать такой класс, можно лишь написать код, в котором сам будешь по char* определять какой класс создать: base_class *create_object(char* obj_type) { if(strcmp(obj_type, "first")) return new child_first; return NULL; } Однако лучше это делать через константы. Определи в .h define'ы для каждого класса и тогда используй switch #define CHILD_FIRST 1 #define CHILD_SECOND 2 base_class *create_object(int obj_type) { switch(obj_type) { case CHILD_FIRST: return new child_first; case CHILD_SECOND: return new child_second; default: return NULL; } } И ещё раз ты возвращаешь base_class*, то будешь "видеть" в child_first только виртуальные функции. Это сообщение отредактировал(а) RAN - 5.6.2003, 08:40 |
|||
|
||||
acp |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 389 Регистрация: 4.2.2003 Где: Владимир Репутация: нет Всего: 2 |
Зато видно, что эта функция возвращает. Разве этого не достаточно? |
|||
|
||||
vickr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.5.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
С acp не совсем согласен. Указателю на родителя можно присваивать указатель на потомка (в свое время при мзучении модели СОМ и множественного наследования интерфейсов для меня это тоже было откровением
![]() RAN Привел вполне подходящее решение. Разумеется, для фиксированного набора дочерних классов. Строки или константы - это уже дело вкуса, в принципе, константы разумнее, согласен. В качестве альтернативы можно предложить использовать шаблон ф-и, типа
Сразу оговорюсь - это первое, что пришло в голову и поэтому привожу код как информацию к размышлению. Писалось прямо здесь. Экспериментируйте, уважаемые ![]() --------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:) |
|||
|
||||
Unregistered |
|
|||
Unregistered |
Нужно использовать патерн "Фабрика классов"
Будет это выглядеть примерно так. Под рукой хелпов и компиляторов нет, поэтому наверняка будут ошибки(особенно в по отношению stl)
Думаю, смысл понятен. |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Предыдуший пост о фабрике классов - мой
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
dAnIK SeNT |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.2.2003 Где: Казань Репутация: нет Всего: нет |
2All
спасибо за ответы ![]()
это я понимаю. хотелось бы автоматизировать процесс.
я бы так и сделал ![]() ![]()
конечно. интерфейс у всех этих классов одинаковый - описанный в абстрактном базовом классе. 2Vyacheslav сходу в код не въехал (только начинаю работать с С++ ![]() ![]() |
||||||
|
|||||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Можно предложить альтернативу шаблонному описанию класса - макрос
Это сообщение отредактировал(а) DENNN - 5.6.2003, 14:16 |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Vyacheslav, а от куда от термин "фабрика классов", я хотел бы почитать об этом, чтоб понять где это используют. Вообще мне кажется, что это лишнее, но это моё мнение. Ведь если приглядеться, то это тоже самое сравнение строк, только после сравнения не сразу создаётся класс, а вызывается static функция, которая создаёт класс. А вот идея DENNNа мне понравилась, но скорее всего имя класса dAnIK SeNT хотел создавать динамически.
Acp, ты сам написал, что родителю можно присваисать потомка. Между прочим это активно использовалось в OWL, но это было давно... Это сообщение отредактировал(а) RAN - 6.6.2003, 00:59 |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
RAN
Основное примущество предложенного мною метода в том, что коды TBaseClass и TFabricClass не требуют модификации при добавлении новых классов, т.е. мы в принципе можем это вынести в ядро нашей системы (например dll) и забыть. Что же касается фабрики классов, действительно простешая фабрика классов предстваляет собой функцию с набором if, типа
Но у нее есть недостаток - при появленнии нового класса эту функцию надо править. Что же касается патеррнов программирования, советую обратить внимание на книгу Приемы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Термин "фабрика классов" активно используется в COM-технологии. Там это действительно "фабрика классов", так как клиент абсолютно не участвует в механизме создания запрашиваемых объектов, а лишь использует их и управляет временем жизни. Такая технология очень удобна при создании "распределенных приложений". В твоем примере такой метод построения может обеспечить некоторый "запас прочности кода" при дальнейшем усовершенствовании.
|
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
"Фабрика классов" - это не порождение COM, а лишь одна из многочисленных реализаций известного паттерна. К тому же на мой вгляд, незачем применять технологию COM, если в этом нет особой необходимости.
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Может ты и прав, но кто нас спрашивает, дядиньки из MicroSoft сказали надо, значит надо. Это теперь стандарт. |
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
А что, дядиньки из MicroSoft сказали, что надо применять COM даже там, где это не нужно? ![]() -------------------- Волны гасят ветер... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |