Russian Qt Forum
Ноябрь 23, 2024, 15:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Скрытие кода реализации библиотеки  (Прочитано 4305 раз)
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, чего быть не должно. Либо я не знаю как это можно сделать не подключая заголовочный файл..

Приложил скелет проекта
« Последнее редактирование: Октябрь 25, 2016, 12:17 от van_de_luxe » Записан
Bepec
Гость
« Ответ #1 : Октябрь 25, 2016, 13:41 »

Предоставлять ашник C_Lib и экспортировать только его.
Записан
van_de_luxe
Гость
« Ответ #2 : Октябрь 25, 2016, 15:22 »

Что предоставлять понятно. Но если я предоставлю Lib.h, в котором есть #include "SubLib.h" он у пользователя не скомпилится. В этом весь вопрос
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Октябрь 25, 2016, 16:04 »

Если совсем никак не обойтись без С_SubLib в вашем h файле, то можно воспользоваться предварительным объявлением класса, быть может это подойдёт в вашем случае.
Код
C++ (Qt)
//MyClass.h
class MySubClass;
 
class MyClass{
public:
   MyClass();
   ~MyClass();
private:
   MySubClass *subClass;
};
 
//MyClass.cpp
#include "MyClass.h"
#include "MySubClass.h"
 
 
MyClass::MyClass()
   : subClass(new MySubClass)
{}
 
MyClass::MyClass(){
   delete subClass;
}
 

Если подкласс членом хотите сделать, то пользуйтесь указателем, как в примере. Можно и просто обойтись методами передающими и возвращающими MySubClass, но передавать можно только по ссылке или указателю.
Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #4 : Октябрь 25, 2016, 16:05 »

Что предоставлять понятно. Но если я предоставлю Lib.h, в котором есть #include "SubLib.h" он у пользователя не скомпилится. В этом весь вопрос

Файл "SubLib.h" надо включать в cpp-файл.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Октябрь 25, 2016, 16:06 »

Добавлю, что если выберете первый вариант, то лучше в примере выше использовать умный указатель, чтобы лишний раз не помнить про delete
Записан
Bepec
Гость
« Ответ #6 : Октябрь 25, 2016, 16:39 »

Вам тогда вообще проще спрятать и первый класс. А наружу выставить лишь попку интерфейс.
Записан
van_de_luxe
Гость
« Ответ #7 : Октябрь 25, 2016, 17:54 »

Если совсем никак не обойтись без С_SubLib в вашем h файле, то можно воспользоваться предварительным объявлением класса, быть может это подойдёт в вашем случае.
попробую

Файл "SubLib.h" надо включать в cpp-файл.
читайте шапку, пользователь не должен видеть этот класс

Добавлю, что если выберете первый вариант, то лучше в примере выше использовать умный указатель, чтобы лишний раз не помнить про delete
что за умный указатель?

Вам тогда вообще проще спрятать и первый класс. А наружу выставить лишь попку интерфейс.
я и спрашиваю как его спрятать, но так чтобы с ним можно было внутри C_Lib работать
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Октябрь 25, 2016, 19:03 »

что за умный указатель?
std::unique_ptr, например
Записан
Bepec
Гость
« Ответ #9 : Октябрь 25, 2016, 19:36 »

В вашем проекте всё сводится к "a+b".

Т.е. вполне реально сделать функцию.

Аля
инициализация + деинициализация.
Код:
SubLib *point;
void my_export init()
{
    point = new SubLib();
}
void my_export deInit()
{
    if (point)
    {
        delete point;
        point = NULL;
    }
}
Экспортируемая функция в библиотеке
Код:
int my_export add(int a, int b)
{
    if (point)
        return point->SubLub_func(a,b);
    return -1;
}

Использование
Код:
dll->init();
int result = dll->add(a,b);
dll->deInit();
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.285 секунд. Запросов: 23.