Events in C++
Hi,
I'm looking for some help on how to best implement an observer pattern in
C++. I have an object that several objects will register with, and on
each event, all the objects are notified.
Any hints about existing libraries/code I could use for this are also
welcome!
Here is a simple example of the code I'm using now:
class ExampleListener
{
public:
virtual ~ExampleListener() { }
virtual void onReceive(ExampleData*) = 0;
};
class ExampleProcessor : public ExampleListener
{
private:
vector<ExampleListener*> todo;
public:
virtual void onData(ExampleData* data)
{
// todo.push_back(data); would cause segfaults later on
todo.push_back( new ExampleData(data) );
}
//...
};
class ExampleGenerator
{
private:
vector<ExampleListener*> listeners;
void fire(ExampleData* d)
{
for (it = listeners.begin(); it != listeners.end(); it++)
(*it)->onData(d);
}
public:
void addListener(ExampleListener* l)
{
listeners.push_back(l);
}
void run()
{
//...
fire(x); delete x;
//..
fire(y); delete y;
//..
}
};
int main()
{
ExampleProcessor a, b;
ExampleGenerator g;
g.addListener(a);
g.addListener(b);
g.run();
}
In my situation, ExampleProcessor typically either stores the data, or
does nothing with it. I don't like the fact that it has to do the copy
itself, it's just too easy to forget!
I though about passing an auto_ptr like this: virtual void onData
(auto_ptr<ExampleData> data) But if I do that, I have to copy the
data for each listener, while typically, only 1 listener will need to
store it. Perhaps some smarter version of auto_ptr is handy here? Any
comments and hints on how to do this best are more than welcome!
greetings,
Wim