yur*_*iks 4 c++ inheritance serialization
对于我的游戏,我有一个Packet类,它代表网络数据包,基本上由一组数据和一些纯虚函数组成
然后我想要从Packet派生类,例如:StatePacket,PauseRequestPacket等.这些子类中的每一个都将实现虚拟函数Handle(),当其中一个数据包时,它将被网络引擎调用.接收到它可以完成它的工作,几个get/set函数可以读取和设置数据数组中的字段.
所以我有两个问题:
如果有人想要任何澄清,请问.
- 谢谢
编辑:我对此不太满意,但这就是我所管理的:
Packet.h:http
:
//pastebin.com/f512e52f1 Packet.cpp:http
://pastebin.com/f5d535d19 PacketFactory.h:http
://pastebin.com/f29b7d637 PacketFactory.cpp:http://pastebin.com / f689edd9b
PacketAcknowledge.h:http://pastebin.com/f50f13d6f
PacketAcknowledge.cpp:http://pastebin.com/f62d34eef
如果有人有时间查看并提出任何改进建议,我会感激不尽.
是的,我知道工厂模式,但我如何编码它来构建每个类?一个巨大的转换声明?这也会重复每个类的ID(一次在工厂,一个在序列化器中),我想避免.
对于复制,您需要编写克隆函数,因为构造函数不能是虚拟的:
virtual Packet * clone() const = 0;
Run Code Online (Sandbox Code Playgroud)
每个Packet实现如下所示:
virtual Packet * clone() const {
return new StatePacket(*this);
}
Run Code Online (Sandbox Code Playgroud)
例如StatePacket.数据包类应该是不可变的.收到数据包后,其数据可以被复制或丢弃.因此不需要赋值运算符.使赋值运算符为私有,不要定义它,这将有效地禁止分配包.
对于反序列化,您使用工厂模式:创建一个类,该类在给定消息ID的情况下创建正确的消息类型.为此,您可以在已知消息ID上使用switch语句,也可以使用以下映射:
struct MessageFactory {
std::map<Packet::IdType, Packet (*)()> map;
MessageFactory() {
map[StatePacket::Id] = &StatePacket::createInstance;
// ... all other
}
Packet * createInstance(Packet::IdType id) {
return map[id]();
}
} globalMessageFactory;
Run Code Online (Sandbox Code Playgroud)
实际上,你应该添加一个检查,比如id是否真的已知和这样的东西.这只是一个粗略的想法.