Классы в .DLL и .SO

C++ ООП .DLL .SO

Возможно ли реализовать динамическое подключение классов из файлов(например dll и so) в C++? И возможно ли хранить классы в DLL и SO?
Ответы:
Это несомненно возможно. Проблема в том, что из-за overloaded functions с++ компилятор вынужден хранить типы аргументов функций (как обычных, так и методов класса) и принадлежность какой-либо функции к классу в символе, по которому эта функция доступна в динамической библиотеке. Разные компиляторы, и иногда даже разные версии одного и того же компилятора, делают эти преобразования по разному. Т.е. нельзя определить заранее по имени функции, какой символ загружать из динамической библиотеки. Однако эти проблемы решаемы, хоть и с некоторым трудом. Методика подробно изложена в [1].
В этом документе информация о загрузке класса, если там известны заранее его методы - через создание абстрактного класса. А как быть если заранее не известны методы, которые будут в классе?
> А как быть если заранее не известны методы, которые будут в классе?
А тогда каким образом реализовать следующее - есть ядро, к нему есть дополнения, которые несут на борту какие либо методы, есть еще модули, которые эти дополнения могут использовать, все вроде просто. НО допустим я создал новое дополнение, и модуль который его использует, каким образом подключить новый модуль и дополнение через ядро? Ведь набор новых методов в дополнении не известен.
Для этого и нужен полиморфизм. Для примера, есть класс дополнений "обработчик звука". У него методы "вывести диалог настройки", "обработать звук" и "получить результат". Другие методы в основной программе просто не нужны по логике работы. Все классы - дополнения наследуются от этого базового класса и все их возможности могут быть доступны через его абстрактный интерфейс. Поведение же самого класса-дополнения внутри его самого программа не только не может, но и не должна регламентировать, поэтому другие методы этого класса ей без надобности.
К предыдущему посту - нужно реализовать это так, чтобы не потребовалось перекомпилировать ядро для каждого изменния списка дополнений/модулей. Поэтому помещение новых заголовков в ядро отпадает.
Приведу пример из самой программы
Еще раз, все классы должны иметь набор доступных для вызова из программы цункций. Наподобие "загрузить", "обработать данные", "выгрузить" и тд. Этот фиксированный набор функций объединяется в абстрактный класс, который служит общим предком для всех классов-модулей. Здесь нет никакой разницы между тем, слинкованы ли они статически, либо загружаются из динамической библиотеки. В любом случае, в программе не может быть вызова неизвестного метода.


17 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.