Прежде всего, ваша иерархия классов выглядит подозрительно.Из того, что вы показали, нет никакой связи между B
и C
, кроме существования третьего типа, A
, который содержит объект B
и указатель C
.И все же, тип переменной внутри B
должен зависеть от того, на какой подкласс C
указывает указатель внутри объекта A
?
Это кажется ненужной связью.Почему бы просто не включить это поле B
в соответствующие подклассы C
?
Предполагая, что вы исправили иерархию классов, у вас осталась относительно простая проблема желания отправлятьодин из двух разных типов сообщений (с разными размерами) через сокет.Вот одно из решений:
enum message_type {type1, type2};
class message_type1
{
...
};
class message_type2
{
...
};
// when sending message (pseudocode)
write message_type variable
write message_type1 object OR message_type2 object
// when reading message (pseudocode)
read message_type variable
if type1
read message_type1 object
else
read message_type2 object
Конечно, message_type1
и message_type2
могут быть связаны, будучи подклассами одного и того же базового класса, или экземплярами одного и того же шаблона и т. Д., Чтобы избежать повторения, если два сообщенияу типов есть некоторые общие черты.
РЕДАКТИРОВАТЬ : Вы упомянули в комментариях к другим ответам, что вы не можете разбить свое сообщение на разные пакеты.Можете ли вы уточнить, что это значит?«Пакет» - это не точный термин: TCP имеет сегментов , UDP и IP имеют дейтаграмм , а Ethernet имеет кадров .Ни один из них не имеет никакого отношения к тому, сколько раз вы вызываете send()
в сокете (т.е. два вызова send()
не не обязательно означают, что два сегмента TCP отправлены; наоборот, размещение одного вызова наsend()
не не гарантирует, что ваши данные будут передаваться в одном сегменте).