假设我有一个C ++类,如:
class Smth {
private:
SomeType somethingOnlyChangedDuringConstruction; // may be something large,
// like a table
int somethingChangeableDuringObjectUse;
public:
Smth(); // default constructor initializes first data member to the
// appropriate value
...
};
我决定使用Boost的序列化来序列化它。如果我只序列化第二个成员,而不是序列化第一个成员以节省存储空间,那么它是“可接受的形式”还是“OK”,因为第一个是在对象构造上创建的?我依赖于调用的默认构造函数(或其他一些构造函数)来确保第一次正确初始化。这样好吗?
您可能还想问:为什么第一个成员不是static const?嗯,事实并非如此,因为有人可能派生出了不同的初始化的Smth类,并且可能还有派生的Smth类,它们不是为了序列化而且在使用过程中会修改该成员。
当然,如果这本身就是一个问题,什么是更好的方式?
这是为了什么?我试图制作一个简单的“有限状态机”实现。第一个成员可以是状态或转换表(实际上,FSM都有)。通常我们不想序列化它,因为它在整个FSM的使用过程中没有变化,因此序列化它只会浪费磁盘上的存储空间,我想保存。 为什么不使用boost的状态图?好吧,我看了它,我认为我不需要所有的功能,而且当我阅读文档以了解如何使用它时,它似乎有由于实例化大量模板而导致状态数量的“可伸缩性”问题,可能耗尽编译器资源,这需要使用“自定义反应”来克服,但随后有一个警告,即自定义反应可能“容易被滥用”到了调用可怕的Undefined Behavior的程度。这听起来像是可能导致奇怪错误的东西,因此我想尝试使用我自己的,更简单的FSM系统来尝试保持代码更安全。