Re: Inheritance question
Jorgen Grahn <grahn+nntp@snipabacken.se> writes:
Well, structs *are* classes ... and "big buffers" are neither.
Maybe you meant "aren't" classes? Otherwise I don't get the neither...>
I'm assuming your problem is not to "manipulate some network data" but
to implement one end of some protocol. And it's probably some
datagram-based protocol rather than streamed text over TCP.
My advice is:
- Don't focus on those messages. Focus on the /protocol/ and the
things the protocol manipulates. The /state/, if there is such a
thing.
- Don't insist on run-time polymorphism for the messages. That's a
whole lot of complexity for eliminating what might be just one
switch ... case:
while(1) {
char buf[1000];
recv(socket, buf, sizeof buf);
RxMessage msg(buf); // no copying needed
handle(msg);
}
void handle(const RxMessage& rx)
{
switch(msg.type) {
...
}
}
What I have to do is to take the raw data, see what it is and pass it to
the next level.
This also in the other direction. I don't really implement network
protocols but more routing protocols (with omnet also).
So what I thought was something like
--8<---------------cut here---------------start------------->8---
Packet p = Packet::createPacket(buffer);
--8<---------------cut here---------------end--------------->8---
where that thing will internally create an object of the right type with
a switch case like
--8<---------------cut here---------------start------------->8---
static Packet Packet::createPacket(buffer) {
switch (buffer[1])
case 0:
// create the object on the rest of the buffer
return Beacon(buffer[1:]);
...
--8<---------------cut here---------------end--------------->8---
The the "handlePacket" function would be always called in the same way
but behaving differently.
I'm not sure either is worthy because I have to see how many things are
actually equal between the different packets, but well I think I should try...