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...