1
class MyClass
{
   private:
      AnotherClass obj;
      float d;
      int k;

    public:
      MyClass(float d = 0.3, int k = 10);
      virtual ~MyClass();
      // other methods goes here
}

是否有可能有一种方法允许此类(MyClass)将其属性值保存在磁盘(硬盘驱动器)上void storeOnDisk(string path){...},而另一种方法允许从磁盘加载属性值void loadFromDisk(string path)

如果可能的话,我是否还应该调用loadFromDisk(path)MyClass 的构造函数(可能创建另一个构造函数)和storeOnDisk(path)MyClass 的析构函数,以便在退出实例化 MyClass 的程序时可以保存所有当前值?

4

2 回答 2

2

它是,您可以使用http://www.boost.org/doc/libs/1_34_0/libs/serialization/doc/index.html。(它正在做更多你期望的事情)

于 2013-10-29T14:59:56.103 回答
2

这取决于您想要实现的目标。但是,通常,您不希望在 ctor/dtor 中有这样的东西,因为在 C++ 中有时会出现“副本”和“临时对象”。在创建/删除时调用ctors/dtors,就像常规对象一样,除非您准备好代码,否则它也会触及文件

通常,保留一个单独的类来处理读/写会更容易一些。想象 aMyClassStorage class将是 afriend的a ,MyClass它只包含两个方法:MyClass read(path)write(path MyClass&)

如果您喜欢在单个类中使用它,或者您不想手动完成所有操作,您可以查看一些序列化框架,例如 Boost::Serialization。关于如何处理它有许多简短而简单的例子,但是 - 仍然 - 你必须先阅读一些关于它的内容。

编辑:

请参阅http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html和“一个非常简单的案例”部分。它展示了如何读/写一个gps_position类。请注意,这个类本身非常简单,只是它包含一个附加serialize功能。此功能“自动”作为读取器和写入器工作。由于通常您想要读取与您想要写入的字段相同的字段,因此不需要说两次(而不是说 read-ABC 和 write-ABC 你说:handleThemForMe-ABC)。

然后,在main您有使用示例。和充当输出和输入文件text_oarchivetext_iarchive一些gps_position对象被创建并命名g,然后保存到一个名为的文件filename中,然后从文件中读回newg.

实际上,这ofstream条线有点太早了,可能会产生误导。它仅用于创建 oarchive,可以像 ifstream/iarchive 一样安全地向下移动。它可能看起来像这样:

// create class instance
const gps_position g(35, 59, 24.567f);

/// ....

// save data to archive
{
    // create and open a character archive for output
    std::ofstream ofs("filename");
    boost::archive::text_oarchive oa(ofs);
    // write class instance to archive
    oa << g;
    // archive and stream closed when destructors are called
}

/// ....

// ... some time later restore the class instance to its orginal state
gps_position newg;
{
    // create and open an archive for input
    std::ifstream ifs("filename");
    boost::archive::text_iarchive ia(ifs);
    // read class state from archive
    ia >> newg;
    // archive and stream closed when destructors are called
}
于 2013-10-29T15:00:43.423 回答