W
Wim
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
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