Название: Скрытие кода реализации библиотеки Отправлено: van_de_luxe от Октябрь 25, 2016, 12:10 Подскажите как правильно организовать структуру проекта.
Не могу сообразить как оформить код для динамической библиотеки, исходные данные такие: class С_Lib{} - он должен быть доступен пользователю class С_SubLib{} - этот класс используется для внутренних расчетов класса С_Lib и пользователь про него ничего не должен знать. Создал шаблонный проект библиотеки с экспортом класса С_Lib И тут возникает вопрос: как подключать исходники класса С_SubLib? единственное решение вижу в том, чтобы подключить в Lib.cpp хедер SubLib.h и внутри cpp объявить "static С_SubLib a", с которым дальше работать. (возможно это вообще не корректно.. я раньше только на си писал) Не будет ли тут подвоха, если создать несколько экземпляров С_Lib? И есть сомнения что будут проблемы с выделением памяти под С_SubLib и его удалением.. Можно было бы объявить "С_SubLib a" private членом С_Lib, но тогда придется в Lib.h подключать SubLib.h, чего быть не должно. Либо я не знаю как это можно сделать не подключая заголовочный файл.. Приложил скелет проекта Название: Re: Скрытие кода реализации библиотеки Отправлено: Bepec от Октябрь 25, 2016, 13:41 Предоставлять ашник C_Lib и экспортировать только его.
Название: Re: Скрытие кода реализации библиотеки Отправлено: van_de_luxe от Октябрь 25, 2016, 15:22 Что предоставлять понятно. Но если я предоставлю Lib.h, в котором есть #include "SubLib.h" он у пользователя не скомпилится. В этом весь вопрос
Название: Re: Скрытие кода реализации библиотеки Отправлено: __Heaven__ от Октябрь 25, 2016, 16:04 Если совсем никак не обойтись без С_SubLib в вашем h файле, то можно воспользоваться предварительным объявлением класса, быть может это подойдёт в вашем случае.
Код
Если подкласс членом хотите сделать, то пользуйтесь указателем, как в примере. Можно и просто обойтись методами передающими и возвращающими MySubClass, но передавать можно только по ссылке или указателю. Название: Re: Скрытие кода реализации библиотеки Отправлено: ksk- от Октябрь 25, 2016, 16:05 Что предоставлять понятно. Но если я предоставлю Lib.h, в котором есть #include "SubLib.h" он у пользователя не скомпилится. В этом весь вопрос Файл "SubLib.h" надо включать в cpp-файл. Название: Re: Скрытие кода реализации библиотеки Отправлено: __Heaven__ от Октябрь 25, 2016, 16:06 Добавлю, что если выберете первый вариант, то лучше в примере выше использовать умный указатель, чтобы лишний раз не помнить про delete
Название: Re: Скрытие кода реализации библиотеки Отправлено: Bepec от Октябрь 25, 2016, 16:39 Вам тогда вообще проще спрятать и первый класс. А наружу выставить лишь
Название: Re: Скрытие кода реализации библиотеки Отправлено: van_de_luxe от Октябрь 25, 2016, 17:54 Если совсем никак не обойтись без С_SubLib в вашем h файле, то можно воспользоваться предварительным объявлением класса, быть может это подойдёт в вашем случае. попробуюФайл "SubLib.h" надо включать в cpp-файл. читайте шапку, пользователь не должен видеть этот классДобавлю, что если выберете первый вариант, то лучше в примере выше использовать умный указатель, чтобы лишний раз не помнить про delete что за умный указатель?Вам тогда вообще проще спрятать и первый класс. А наружу выставить лишь я и спрашиваю как его спрятать, но так чтобы с ним можно было внутри C_Lib работатьНазвание: Re: Скрытие кода реализации библиотеки Отправлено: __Heaven__ от Октябрь 25, 2016, 19:03 что за умный указатель? std::unique_ptr, напримерНазвание: Re: Скрытие кода реализации библиотеки Отправлено: Bepec от Октябрь 25, 2016, 19:36 В вашем проекте всё сводится к "a+b".
Т.е. вполне реально сделать функцию. Аля инициализация + деинициализация. Код: SubLib *point; Код: int my_export add(int a, int b) Использование Код: dll->init(); |