Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Неявное создание объектов в С++

Автор: Vinick
Дата сообщения: 18.02.2003 19:19
Хочу реализовать что-то вроде механизма плагинов, пока не динамически подключаемых. Каждый плагин представляет собой класс имеющий метод run() внутри которого и будет выполняться полезная работа. Проблема в том что при запуске надо инициализировать GUI, т.е сообщить ему(ей) какие плагины в данный момент существуют, при этом сами объекты классов, реализующих плагины, еще не созданы.
Для этого придумал такую конструкцию :

Код:
class AbstractPlugin
{
public:
virtual void run()=0;
virtual string initGUI()=0;
};

class PluginCtor
{
public:
virtual AbstractPlugin * create()=0;
virtual void registerPlugin()=0;
};

class PluginManager
{
friend class PluginCtor;
public:
static vector<PluginCtor *> * theCtors;
};

#define CREATECTOR(name) \
class Ctor##name : public PluginCtor { \
public: \
AbstractPlugin * create() { return new (##name)();} \
void registerPlugin() {PluginManager::theCtors->push_back(this);} \
Ctor##name() {registerPlugin();} \
}; \
static Ctor##name Ctor##name##_var;

class RealPlugin : public AbstractPlugin
{
public:
void run();
string initGUI();
};
Автор: Holder
Дата сообщения: 19.02.2003 09:44
Может такое подойдет?

Код:
class AbstractPlugin
{
public:
virtual void run() = 0;
virtual string initGUI() = 0;
};

class RealPlugin : public AbstractPlugin
{
public:
void run(){/*do something*/};
string initGUI(){return "RealPlugin";};
};

class OtherPlugin : public AbstractPlugin
{
public:
void run(){/*do something*/};
string initGUI(){return "OtherPlugin";};
};

class PluginManager
{
private:
AbstractPlugin* Create(string n)
{
if (n == "RealPlugin") return new RealPlugin();
if (n == "OtherPlugin") return new OtherPlugin();
//...
return 0;
};
public:
vector<AbstractPlugin*> theCtors;
void Add(string n){theCtors.push_back(Create(n));};
};
Автор: Vinick
Дата сообщения: 19.02.2003 16:02
Нет, к сожалению такой вариант мне не подойдет.

Дело в том, что ни main ни PluginManager ничего не знают о плагинах. Т.е main и PluginManager напишу(уже пишу) я, а сами плагины - кто-то другой (м.б. несколько человек). И поэтому хочется сделать механизм добавления нового плагина без изменения уже существующего кода.
Автор: Wowik
Дата сообщения: 20.02.2003 01:59
http://www.codenet.ru/progr/cpp/plug.php
Автор: Vinick
Дата сообщения: 20.02.2003 06:33

Цитата:
http://www.codenet.ru/progr/cpp/plug.php


Спасибо большое.

Наверное так и сделаем, хотя я хотел реализовать это только средствами языка (без использования GetProcAddress и ей подобных).
И в догонку - нет такой же ссылки, но только на пример из мира *NIX ?
Автор: pz123
Дата сообщения: 21.02.2003 13:08
Vinick
Посмотри исходники CppUnit
Там как статически, так и динамически подключаемые плагины поддерживаются. Причем под разными платформами.

Если подключать статически, то принцип похож на то что ты писал в первом посте, просто терминология другая.

Кстати, статические переменные - это и есть средства языка

Страницы: 1

Предыдущая тема: Delphi: Interface'ы


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.