1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include <iostream>
#include <list>
#include <boost/function.hpp>
// GPoint est une structure dont une instance va être passée en paramètre à
// la fonction appelée par l'event
struct GPoint
{
GPoint(int px = 0, int py = 0) : x(px), y(py) {}
int x,y;
};
// Target1 et Target2 sont des classes qui contiennent une fonction (f1 et f2) qui sera appelée par l'event
class Target1
{
public:
Target1(int a = 0) : _i (a) {}
// Add est la fonction qui va être appelée par l'event
void f1(GPoint pt) {
_i = pt.x + pt.y;
}
void Print(){std::cout << "i = " << _i << std::endl;}
private:
int _i;
};
class Target2
{
public:
Target2(int a = 0) : _i (a) {}
// Add est la fonction qui va être appelée par l'event
void f2(GPoint pt) {
_i = pt.x - pt.y;
}
void Print(){std::cout << "i = " << _i << std::endl;}
private:
int _i;
};
// classe abstraite IEvent (indispensable pour stocker les events dans un conteneur)
class IEvent
{
public:
virtual void Execute() = 0;
};
// la classe event
template <typename TargetObjType, typename ParamObjType>
class GEvent : public IEvent
{
public:
// le constructeur
GEvent( TargetObjType* pTargetObj,
boost::function<void (TargetObjType*, ParamObjType)> targetFunc,
ParamObjType param):_targetObj(pTargetObj), _targetFunc(targetFunc),_param(param)
{}
// la fonction Execute
void Execute(){
_targetFunc( _targetObj, _param );
}
private:
TargetObjType* _targetObj;
boost::function<void (TargetObjType*, GPoint)> _targetFunc;
ParamObjType _param;
};
// un exemple d'utilisation
int main(int argc, char* argv[])
{
// création d'instances des classes cibles
Target1* pTarget1 = new Target1();
Target2* pTarget2 = new Target2();
// affichage de l'état des classes cibles
pTarget1->Print();
pTarget2->Print();
// création de 2 evenements
GEvent<Target1, GPoint> *evt1 = new GEvent<Target1, GPoint>(pTarget1, &Target1::f1, GPoint(10,20) );
GEvent<Target2, GPoint> *evt2 = new GEvent<Target2, GPoint>(pTarget2, &Target2::f2, GPoint(1,2) );
// stockage des evenements dans une liste
std::list<IEvent*> l;
l.push_back( evt1 );
l.push_back( evt2 );
// execution des evenements
for ( std::list<IEvent*>::iterator it = l.begin();
it != l.end();
it++ )
{
(*it)->Execute();
}
// affichage de l'état des classes cibles
pTarget1->Print();
pTarget2->Print();
std::cin.get();
return 0;
} |
Partager