在静态/非静态方面组织加载/保存功能的最佳方法

Chr*_*lin 5 c++

我有一个类定义数据库的历史提取:

class ExtractionConfiguration  
{  
    string ExtractionName;  
    time ExtractionStartTime;  
    time ExtractionEndTime;

    // Should these functions be static/non-static?
    // The load/save path is a function of ExtractionName
    void SaveConfigruation();
    void LoadConfiguration();
}  
Run Code Online (Sandbox Code Playgroud)

这些ExtractionConfiguration需要保存到磁盘/从磁盘加载.在静态/非静态方面组织保存/加载功能的最佳方法是什么?对我来说,很明显SaveConfiguration()应该是一个成员函数.但是使用LoadConfiguration(),调用更有意义

ExtractionConfiguration newExtraction;  
newExtraction.LoadConfiguration();
Run Code Online (Sandbox Code Playgroud)

并有一个临时的空实例或使加载功能静态

static ExtractionConfiguration LoadConfiguration(string filename);
Run Code Online (Sandbox Code Playgroud)

然后打电话

ExtractionConfiguration newExtraction = ExtractionConfiguration::LoadConfiguration(filename);
Run Code Online (Sandbox Code Playgroud)

对我来说感觉更整洁,但打破了加载/保存机制的"对称性"(这是否是一个有意义/值得考虑的问题?).

我想要求'最好'的答案有点天真.我真的想要更好地理解这里涉及的问题.

PS这是我关于SO的第一个问题,所以如果我没有正确提出,请告诉我,我会尽力让问题更清晰.

Tro*_*nic 1

您应该考虑使用Boost.Serialization 风格的序列化函数,以避免使用单独的函数来保存和加载(即使您不使用库本身)。

在这种方法中,您可以向函数传递具有运算符&的任何类型的对象,以对所有成员变量执行操作。其中一个这样的对象可能会将数据保存到文件中,另一个可能会从文件中加载,第三个可能会在控制台上打印数据(用于调试等)。

如果您希望保留单独的函数,将它们作为非静态成员可能是更好的选择。对于保存功能来说这是显而易见的,但加载则是另一回事,因为您需要构造对象。然而,我猜,出于对称原因,通常加载是通过默认构造然后调用加载非静态成员函数来完成的。

将加载作为返回新对象的函数在某些方面似乎更好,但您需要决定它如何返回对象。是通过new分配的,还是简单的通过值返回?按值返回要求对象可复制,并且返回指针要求资源管理方案(不能仅将对象存储在堆栈上)。