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)
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);
} /
il tutto sembra funzionare , il problema è che quando notifico ad un qualsiasi observer e arrivo nell' update:
codice:
Flower2* parent;
void update(Observable* o, Argument * arg)
{
cout << arg->m_name;
parent->open();
};
vorrei avere un puntatore valido in parent alla classe flower2 instanziata , mentre mi viene sempre un puntatore non valido 0xccccccc per intenderci.
grazie.