crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Неопределенные классы в динамической библиотеке
Count0
  опции профиля:
сообщение 28.10.2014, 11:43
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 17
Регистрация: 30.7.2011
Пользователь №: 2772

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток.
Возникла следующая проблема:
Для исследовательского ПО разрабатывается программный код использующий динамические библиотеки для хранения взаимозаменяемых алгоритмов.
Поскольку цель ПО - проведение исследований, то в дальнейшем планируется появление неограниченного числа новых библиотек, ни сигнатуру ни корректность функций которых не представляется возможным проконтролировать.
Поэтому пришлось разработать иерархию шаблонных классов которые принимают указатель на функцию библиотеки, описание допустимых диапазонов ее параметров, на основе которых генерирую пользовательский интерфейс для инициализации параметров, а затем по требованию пользователя запускают ее по указателю.
Таким образом, все что требуется от разработчика библиотеки создать функцию обертку которая передает все данные в синглтон-регистратор.
Вопрос в том: можно ли избежать включения всех исходников данной иерархии в динамическую библиотеку, оставив их только в основной части программы, а вбиблиотеках ограничиться опережающими объявлениями.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ViGOur
  опции профиля:
сообщение 5.11.2014, 10:35
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ну вот сделал набросок:

"factory.h"
#ifndef FACTORY_H
#define FACTORY_H

#include <string>

class CAlgorithmBase;

template<typename TYPE>
class CFactoryBase
{
public:
    virtual TYPE *createInstance() = 0;
    virtual void destroyInstance(void *) = 0;
};

template<typename TYPE, typename BASETYPE>
class CFactoryAlgorithm : public CFactoryBase<BASETYPE>
{
public:
    TYPE *createInstance()
    {
        TYPE *pType = new TYPE();
        return pType;
    }
    void destroyInstance(void *p)
    {
        delete static_cast<TYPE*>(p);
    }
};


template<typename TYPE>
CFactoryBase<CAlgorithmBase>* MakeFactoryAlgorithm()
{
    static CFactoryAlgorithm<TYPE, CAlgorithmBase> fac;
    return &fac;
}

struct sFactoryAssocAlgorithm
{
    std::string szNameAlgorithm;
    CFactoryBase<CAlgorithmBase> *pFactory;
};


#endif // FACTORY_H
"main.cpp"
#include "factory.h"
#include <iostream>

class CAlgorithmBase
{
protected:
    std::string m_szName;
public:
    CAlgorithmBase(){m_szName = "CAlgorithmBase";}
    void print(){std::cout << "Algorithm: " << m_szName << std::endl;}
};

class CAlgo0 : public CAlgorithmBase
{
public:
    CAlgo0(){m_szName = "CAlgo0";}
};

class CAlgo1 : public CAlgorithmBase
{
public:
    CAlgo1(){m_szName = "CAlgo1";}
};

class CAlgo2 : public CAlgorithmBase
{
public:
    CAlgo2(){m_szName = "CAlgo2";}
};

sFactoryAssocAlgorithm g_algos[]=
{
    {"algo0", MakeFactoryAlgorithm<CAlgo0>()},
    {"algo1", MakeFactoryAlgorithm<CAlgo1>()},
    {"algo2", MakeFactoryAlgorithm<CAlgo2>()}
};

int main(int argc, char *argv[])
{
    int nCount = sizeof(g_algos)/sizeof(*g_algos);
    std::cout << "Algorithm count: " << nCount << std::endl;
    for( int n = 0; n < nCount; n++ )
    {
        CAlgorithmBase *pObj = g_algos[n].pFactory->createInstance();
        pObj->print();
        g_algos[n].pFactory->destroyInstance( pObj );
    }

    return 0;
}
"результат работы"
Algorithm count: 3
Algorithm: CAlgo0
Algorithm: CAlgo1
Algorithm: CAlgo2

Ну и по коду видно, что тебе остается только динамически заполнить массив g_algos, каждый элемент которого может возвращать загружаемая библиотека с тем или иным алгоритмом и все, если я конечно же тебя правильно понял...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Count0   Неопределенные классы в динамической библиотеке   28.10.2014, 11:43
- - Iron Bug   ответ: нет. шаблоны используются только на этапе к...   28.10.2014, 15:25
- - Count0   То есть придется потребовать добавлять всю иерархи...   28.10.2014, 15:40
- - Iron Bug   смотря что там в иерархии. всё, где шаблоны, котор...   28.10.2014, 15:59
- - Count0   Большое спасибо Вам. Тут так не получится, указат...   28.10.2014, 16:04
- - Iron Bug   я не очень понимаю суть задачи. понятие плагина су...   29.10.2014, 12:04
- - ViGOur   Завтра мне напомните, у меня есть идейка как подоб...   4.11.2014, 22:50
- - ViGOur   Ну вот сделал набросок: "factory.h"#ifn...   5.11.2014, 10:35
- - Iron Bug   ViGOur, тут вопрос в том, как передавать параметры...   5.11.2014, 11:14
- - ViGOur   Тут мне кажется немного не правильный подход. Зач...   5.11.2014, 12:18
- - Iron Bug   GUI тут вообще ни при чём. я так понимаю, что это ...   5.11.2014, 13:04
- - ViGOur   не обязательно, можно так же передавать указатель ...   5.11.2014, 13:15
- - Iron Bug   ну да. только без темплейтов получится монстр. пот...   5.11.2014, 13:55
- - ViGOur   Блин, блинский, это то у меня совсем из головы-то ...   5.11.2014, 14:34
- - Flex Ferrum   (зашёл сюда по приглашению ViGOur'а) Мне видит...   5.11.2014, 16:12


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 8:07