gpt4 book ai didi

c++ - C++中的消息多态性

转载 作者:行者123 更新时间:2023-11-30 02:41:01 25 4
gpt4 key购买 nike

我使用以下设计在 2 个应用程序之间发送消息。

class InternalMessage
{
public:


InternalMessage(unsigned int messageId, unsigned int messageSize, INTERNAL_MESSAGE_TYPE messageType)
: messageId_(messageId), messageSize_(messageSize), messageType_(messageType) {}
virtual ~InternalMessage() {}


protected:
unsigned int messageId_;
unsigned int messageSize_;
INTERNAL_MESSAGE_TYPE messageType_;
};

然后还有其他几个使用继承的消息:

class KeyPressMessage : public InternalMessage
{
public:
KeyPressMessage () : InternalMessage(RADIO_KEY_PRESS_MESSAGE_ID, sizeof(KeyPressMessage ), EVENT_MESSAGE_TYPE),
key_(INVALID_KEY) {}

virtual ~KeyPressMessage () {}


}


private:
KEY key_;
};

在接收消息时我们使用基类指针:

MsgHandler(InternalMessage* )

在发送消息时,我们使用派生类 sizeof 来计算要发送的字节数:

sizeof(KeyPressMessage )

似乎使用这样的设计是不好的,因为 sizeof 派生类包含虚拟表(可以在 32 位和 64 位操作系统之间更改)。我想问一下是否有更好的方法来实现消息处理程序和发送者/接收者的 ICD?我需要一些序列化/反序列化吗?

最佳答案

sizeof() 即使在同一操作系统上使用不同的编译器/构建选项时,也可能会给出不同的结果。在编写通过网络或外部进程运行的代码时,您确实需要编写序列化/反序列化代码。

在您的示例中,情况更糟:您正在编写指针 (VTBL),这对另一个进程没有任何意义 - 它可能具有不同的内存布局,函数将位于不同的地址。

有两种处理序列化的方法:

  • 一个一个地写入和读取字段。

    非常简单且非常便携。尽管代码量比其他选项稍大,但它有利于控制类型长度和字节顺序。

  • 使用打包的 POD 数据结构。

    好吧,只有基本类型,编译器强制不对齐它们,所以它们总是采用相同的大小(假设数据类型是固定的)。

为确保一切正常,您必须:

  • 只使用固定长度的数据类型。没有 int。使用 int32_t 和 C99 中的类似内容。
  • 确保数据编码始终使用相同的字节顺序。

关于c++ - C++中的消息多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com