ciao.
ho creato due classi che dialogano tra di loro implementando l'observer.
Ognuna di queste classi deve essere insieme un observer e un observable e per questo doppio comportamento ho utilizzato le inner class:
(non inserisco le classi astratte observer e observable)
il tutto sembra funzionare , il problema è che quando notifico ad un qualsiasi observer e arrivo nell' update:codice:class Flower : Observable { bool isOpen; public: Flower() : isOpen(false) {} void open() { // Opens its petals string m_name = "pippo"; isOpen = true; } void close() { // Closes its petals isOpen = false; } // Using the "inner class" idiom: class FlowerObserver; friend class Flower::FlowerObserver; class FlowerObserver : public Observer { Flower* parent; void update(Observable* o, Argument * arg) { cout <<"flower" << arg->m_name; }; public: } FlowerObserver; std::set<Observer*> observers; void addObserver(Observer& o) { observers.insert(&o); } void notifyObservers(Argument* arg=0) { std::set<Observer*>::iterator it; for(it = observers.begin(); it != observers.end(); it++){ (*it)->update(this, arg); } } }; class Flower2 : Observable { bool isOpen; public: Flower2() : isOpen(false) {} void open() { // Opens its petals isOpen = true; } void close() { // Closes its petals isOpen = false; } // Using the "inner class" idiom: class Flower2Observer; friend class Flower2::Flower2Observer; class FlowerObserver : public Observer { Flower2* parent; void update(Observable* o, Argument * arg) { cout << arg->m_name; parent->open(); }; public: }Flower2Observer; std::set<Observer*> observers; void addObserver(Observer& o) { observers.insert(&o); } void notifyObservers(Argument* arg=0) { std::set<Observer*>::iterator it; for(it = observers.begin(); it != observers.end(); it++){ (*it)->update(this, arg); } } }; int main() { Flower f; Flower2 f2; f.addObserver(f2.Flower2Observer); f2.addObserver(f.FlowerObserver); Argument a; Argument b; f2.notifyObservers(&b); f.notifyObservers(&a); } /
vorrei avere un puntatore valido in parent alla classe flower2 instanziata , mentre mi viene sempre un puntatore non valido 0xccccccc per intenderci.codice:Flower2* parent; void update(Observable* o, Argument * arg) { cout << arg->m_name; parent->open(); };
grazie.

Rispondi quotando