Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Глобально доступная информация

19.03.09 23:02
Глобально доступная информация
 
  Chipolino свой человек
Как наиболее элегантно организовать доступ к данным , которые должны быть глобально доступны ? ( Ахтунг дальше плюсы)
У меня есть несколько фабрик , и мне нужно из многих мест в программе знать, какой объект активен.
Пока вот что придумал :
Имеем небольшую иерархию
struct CANDevice
{
virtual ~CANDevice() {}
};
struct CANDevice1:public CANDevice
{
};
struct CANDevice2:public CANDevice
{
};

Фабрика

class CANDeviceFactory
{
public:
typedef CANDevice* (*Creator)();
CANDeviceFactory()
{
registerDevice("device 1" , &createCANDevice<CANDevice1>);
registerDevice("device 1" , &createCANDevice<CANDevice2>);
}
shared_ptr<CANDevice> create(std::string const & id)
{
return shared_ptr<CANDevice>(creators_[id]());
}
void registerDevice(std::string const & id,Creator creator)
{
creators_[id]=creator;
}
private:
std::map<std::string, Creator> creators_;
};

И собственно в функции креаторе регистрируем объект

template<class CANDeviceType>
CANDevice* createCANDevice()
{
CANDevice* device = new CANDeviceType();
Info::current<CANDevice>().set(device); // смотри ниже
return device;
}

И теперь класс Info

template<class T>
class CurrentItem
{
public:
T* get() { return item_;}
void set(T* item) { item_=item; }
private:
T* item_;
};
class Info
{
public:
template<class T>
static CurrentItem<T> & current()
{
static CurrentItem<T> item;
return item;
}
};

Где-нибудь в коде

CANDeviceFactory factory;
factory.create("device 1");
// теперь с любого места в программе
Info::current<CANDevice>().get()

Жду ваших советов :-)

 

Перейти на