Хочу реализовать что-то вроде механизма плагинов, пока не динамически подключаемых. Каждый плагин представляет собой класс имеющий метод 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();
};
Для этого придумал такую конструкцию :
Код:
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();
};