Bonjour à tous,
Je m'intéresse depuis peu aux design patterns et de tous les bénéfices que cela peut apporter. Je m'intéresse donc, dans un premier temps, au pattern "Observer" qui me semble être une base particulièrement utile dans mes différents projets.
Pour le moment, tout va bien. J'ai compris le fonctionnement (relativement simple) et suis capable de le mettre en œuvre sur des sujets simples. Cependant, je me demandais comment mettre en place un tel type de pattern dans le cas où on se retrouve avec un grand nombre de valeurs à passer.
Par exemple, je peux avoir un Transmetteur "Clavier" qui comme son nom l'indique envoi une notification à ses récepteurs en incluant les touches pressées. A côté de ça, un autre transmetteur "Souris" qui notifie ses récepteurs de l'état de ses boutons etc... Jusqu'à lors, ce que j'arrive à faire se limite à un seul évènement.
Comment puis-je faire pour qu'un récepteur accepte via une fonction unique n'importe quel type de données ? J'ai bien tenté de renvoyer au récepteur un pointeur sur le transmetteur, mais étant donné que mes classes Transmetteur et Recepteur sont virtuelles le compilateur m'envoie gentiment valser dans tous les coins.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 class Sensor: public Transmitter { private: int _data; public: Sensor(): _data(0) {} virtual ~Sensor() {} virtual void setData(const int &i) { _data = i; update(); } virtual int getData() { return _data; } }; class Machine: public Receiver { public: Machine() { } ~Machine() { } virtual bool notify() { std::cout << "notified val : " << std::endl; return true; } virtual bool notify(vx::SmartPtr<Transmitter> T) { std::cout << "notified val : "<< (*T).getData() << std::endl; return true; } };
retour du compilo :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 In member function 'virtual bool Machine::notify(vx::SmartPtr<Transmitter>)':| error: 'class Transmitter' has no member named 'getData'|
Merci d'avance pour vos retours.
Partager