vl106 wrote:
On 5 Feb., 15:04, Ulrich Eckhardt <eckha...@satorlaser.com> wrote:
Seeing your other posting here, I have a question: why do you insist
on using templates? AFAICT, they just don't fit your goals of
creating different objects at runtime, though I'm guessing a bit what
those goals could actually be.
Thanks for your answers. I think templates are a good solution to my
problem:
[PSEUDOCODE]
void receive_message(int messageId, char* messageData) {
Base& newMessage = Factory::create(messageId, messageData);
newMessage.process();
}
The receive_message function will stay pretty stable. If new kind of
message
is "invented" only a new specialication has to be created.
What really differs is the process method. Each specialization (based
on messageId) has ist own (and different) behaviour.
This still does not look like a situation where templates are the proper
solution.
I would go for a classic OO design and a factory method:
class Message {
public:
static auto_ptr<Message> create(int id, char* payload);
virtual void process() { throw "unknown message"; }
int getId() const { return id; }
virtual ~Message() {}
protected:
Message(int id, char* payload);
char* payload;
int id;
};
class SomeMessage : public Message {
public:
void process();
SomeMessage(int id, char* payload) : Message(id, payload) {}
};
class SomeOtherMessage : public Message {
public:
void process();
SomeOtherMessage(int id, char* payload) : Message(id, payload) {}
};
auto_ptr<Message> Message::create(int id, char* payload)
{
switch (id)
{
case 1:
return new SomeMessage(id, payload);
case 2:
return new SomeOtherMessage(id, payload);
default:
return new Message(id, payload);
}
}
When adding a new message, you only have to define a new subclass, with
the appropriate process() implementation, and update the
Message::create function to recognise the new message-id.
And there are even techniques to do the last part automatically on
program startup by letting message classes register themselves.
Thanks, for that push. For some reason templates attracted me. The "classic"
library. But automatically registering fixes this.
[ comp.lang.c++.moderated. First time posters: Do this! ]