這取決於你想達到的目標。但是,通常情況下,你不希望在ctor/dtor中有這樣的事情,因爲有時候會在C++「副本」和「臨時對象」中出現。 Ctors/dtors在被創建/移除時被調用,就像常規對象一樣,除非您準備好代碼以及。
通常保持一個單獨的類來處理讀/寫有點容易。想象一下MyClassStorage class
這將是MyClass
的friend
,並且將只包含兩種方法:MyClass read(path)
和write(path MyClass&)
。
如果你喜歡在單個類中使用它,或者如果你不想手動完成所有的事情,你可以看看一些序列化框架如Boost :: Serialization。關於如何處理它有許多簡短的例子,但是 - 但是 - 你必須先閱讀一些關於它的內容。
編輯:
見http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html和 「一個非常簡單的情況」 一節。它顯示如何讀取/寫入gps_position
類。請注意,這個類iteself非常簡單,只是它包含一個額外的serialize
函數。這個功能既可以作爲讀寫器工作,也可以「自動地」工作。由於通常你想閱讀相同的領域,所以你不需要說兩遍(而不是說讀-A-B-C和寫-A-B-C你說:handleThemForMe-A-B-C)。
然後,在main
你有使用的例子。 text_oarchive
和text_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
}
它被稱爲序列化。 – LihO
請看看:[序列化](http://www.parashift.com/c++-faq/serialization.html) – Pol0nium
第一個問題:是的。第二個問題,如果你喜歡,當然。但是我認爲如果數據恰好可用並且您希望以某種以前的狀態加載,您會想要從析構函數調用storeOnDisk以在對象狀態被刪除之前保存對象狀態,並在構造函數中loadFromDisk。 –