![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
ViGOur |
![]()
Сообщение
#1
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Я создаю динамически объекты некоторых произвольных классов, родитель у них один, тип только разный.
Для вопроизведения ошибки набросал следующий код:
В конструкции template <class T, int TYPE>, TYPE сделан для того, чтобы при инстанцировании различались типы объектов данного класса с задумкой на будущее... И данный тип передается динамически, во время выполнения программы. Тоесть, у меня из вне приходит некий tmpEnum, что в примере и я на основе него должен создать-получить объект mc4, но возникает ошибка указанная в коментарии при создании объекта mc4 . Как я понимаю это из-за того, что у меня переменная создается динамически (во время выполнения), а шаблон должен быть инстанцирован статически (во время компиляции). Поправьте меня если я ошибаюсь. И собственно вопрос, как сделать так, чтобы это работало и возможно ли это? ![]() Если это не возможно, то буду думать как сделать по другому... |
|
|
ssoft |
![]()
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: ![]() ![]() ![]() |
Как я понимаю это из-за того, что у меня переменная создается динамически (во время выполнения), а шаблон должен быть инстанцирован статически (во время компиляции). Поправьте меня если я ошибаюсь. И собственно вопрос, как сделать так, чтобы это работало и возможно ли это? ![]() Если это не возможно, то буду думать как сделать по другому... Имено так, шаблоны конкретизируются во время компиляции и нет возможности использовать динамически изменяющиеся параметры шаблона. В данном случае, я подозреваю, что необходимо использовать паттерн "Фабрика". |
|
|
ViGOur |
![]()
Сообщение
#3
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Боюсь паттерн Фабричный метод здесь не поможет, дело в том, что шаблонный класс реализован как синглтон, которому в качестве параметров передаются:
1. класс, объект которого нужно создать-получить. 2. некий внутренний тип, который явно идентифицирует объект, так как класс для некоего множества объектов может быть один, а тип у них разный... Например: Пока вижу только не очень хороший выход в использовании ручной типизации, но это геморно и чревато ошибками... ![]() Или я что-то не додумываю-недопонию? |
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
если это связано с типами, то тожно тупо в конструкторе передавать std::type_info. ну или вообще что угодно.
|
|
|
ViGOur |
![]()
Сообщение
#5
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Неа, в моем случае объекты p3 и p4 (ePudel и eTaksa) это разные типы, и так как они по разному инстанцируются, то и разные объекты.
Простая передача параметра в конструкторе не даст того же результата... Например, p5 == p3, а p6 == p4, но p5 != p6.
|
|
|
Алексей1153 |
![]()
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
имхо, виртуальное наследование спасёт )
|
|
|
ViGOur |
![]()
Сообщение
#7
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
имхо, виртуальное наследование спасёт ) Это как я понимаю и есть фабричный метод! Боюсь паттерн Фабричный метод здесь не поможет, дело в том, что шаблонный класс реализован как синглтон, которому в качестве параметров передаются: И если это реализовывать, то в моем случае класс CPudel, будет заботится о создании самого себя, в место шаблонного класса (который, как я писал уже выше, является синглтоном), а вместе с этим в нем нужно будет закрывать: конструктор, деструктор, конструктор копирования и оператор присваивания... А так же, если в моем зоопарке будет за 100500 зверей, то всем им нужно будет делать то же самое и описывать своё рождение!Как-то не комильфо... Звери тут в качестве примера и не более! ![]() з.ы. или я все же не правильно понял идею вашей реализации. |
|
|
Алексей1153 |
![]()
Сообщение
#8
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Это как я понимаю и есть фабричный метод! нет, это возможности языка. Фабрика - это отдельный класс/процедура, которая порождает объекты по маркеру их типа и возвращает указатель типа "родитель" синглтон можно сделать статическим методом родительского класса (синглтон Майерса) а описывать разницу в поведении типов всё равно где-то придётся ![]() можно все классы поместить в один namespace , тогда путаться ничего не будет |
|
|
ViGOur |
![]()
Сообщение
#9
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Пока я вижу выход, как я уже говорил:
Пока вижу только не очень хороший выход в использовании ручной типизации, но это геморно и чревато ошибками... в использовании switch, например так:![]()
|
|
|
Алексей1153 |
![]()
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 16.2.2025, 19:06 |