![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Tiarwe |
|
||||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 24.8.2011 Репутация: нет Всего: нет |
Добрый день!
Есть такой вот интерфейс:
От него наследуются реализации:
Идея следующая: DecoderA был создан изначально программистом и его реализация скрыта от глаз (.h недоступен), DecoderB - добавлен в дальнейшем в процессе работы (.h доступен). Этим всем делом заведует некий Decoder:
Соответственно, используется это дело так:
Теперь мне нужно скрыть реализацию DecoderA с глаз:
Соответственно, при компиляции сыпятся ошибки, что для DecoderA не найден конструктор. Делаем специализацию, которую помещаем в .cpp (откуда будет виден DecoderA.h и виден конструктор этого класса):
Снова ошибки при компиляции. Изменяем код следующим образом:
Теперь реализация DecoderA работает, но инициализировать Decoder другими реализациями интерфейса нельзя, т.к. функции Initialize() определена лишь для спецификации DecoderA... Как, а главное можно-ли, заставить шаблон работать со всеми реализациями интерфейса, включая те, что скрыты от глаз разработчика (например DecoderA)? Это сообщение отредактировал(а) Tiarwe - 17.9.2014, 23:40 |
||||||||||||||
|
|||||||||||||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
Я себе тяжело эту ситуацию представляю. Зачем и главное как потом с этим классом работать? Обычно интерфейс доступен, и он описывается в .h, а реализация прячется в .cpp. Допустим программист написал какую-то библиотеку, собрал её в виде lib или so. Реализация скрыта, но интейрфейс он в любом случае предоставляет с помощью файлов .h. Короче, я похоже не особо понял, что хочет ТС. И ещё вопрос, а не проще сделать шаблонным весь класс, а не только функцию Initialize()? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| Tiarwe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 24.8.2011 Репутация: нет Всего: нет |
Объясняю) Есть интерфейс для, например, рендера графики. Его реализации используют всякие OpenGL и DirectX функции. Если их засунуть в сорцы, затем собрать статическую библиотеку, то в дальнейшем, когда создаём какой-то новый проект и хотим рисовать графику, нет нужны таскать с собой хедеры DX, OpenGL и писать по 20 раз к ним пути. Достаточно просто прилинковать библиотеку и выбрать реализацию. Сейчас всё так и работает, но нет возможности указывать с какой именно реализацией мы хотим работать - она выбирается через перечисление, передаваемое в Initialize(). А если мне хочется использовать какую-то ещё новую реализацию, то приходится перегружать эту функцию и передавать в неё указатель. Добавлено через 13 минут и 35 секунд
Думал, не подходит. Допустим, у нас есть класс A, в котором есть Decoder. Его реализация может выбираться в зависимости от платформы. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Тогда нужно писать плагин. реализация класса в плагине, интерфейс в заголовке, используемом в основной программе и плагине.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |