2013-10-29 105 views
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 
} 

對象上/存儲/加載c是可以具有允許這個類(MyClass的),以保存到其屬性值的磁盤(硬盤驅動器)上,其允許加載一個方法void storeOnDisk(string path){...}和另一種方法磁盤void loadFromDisk(string path)的屬性值?++從磁盤

如果可能的話,我應該也呼籲loadFromDisk(path) MyClass中的構造函數(創建另一個構造也許)MyClass中的析構函數,並storeOnDisk(path)使所有電流值可以退出該實例化MyClass的程序時被保存?

+0

它被稱爲序列化。 – LihO

+0

請看看:[序列化](http://www.parashift.com/c++-faq/serialization.html) – Pol0nium

+1

第一個問題:是的。第二個問題,如果你喜歡,當然。但是我認爲如果數據恰好可用並且您希望以某種以前的狀態加載,您會想要從析構函數調用storeOnDisk以在對象狀態被刪除之前保存對象狀態,並在構造函數中loadFromDisk。 –

回答

2

這取決於你想達到的目標。但是,通常情況下,你不希望在ctor/dtor中有這樣的事情,因爲有時候會在C++「副本」和「臨時對象」中出現。 Ctors/dtors在被創建/移除時被調用,就像常規對象一樣,除非您準備好代碼以及

通常保持一個單獨的類來處理讀/寫有點容易。想象一下MyClassStorage class這將是MyClassfriend,並且將只包含兩種方法: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_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 
} 
+0

是否有任何最小的簡單工作代碼可以直接用於我的示例使用Boost :: Serialization?因爲我不想讓事情變得複雜。 – shn

+0

@shn:我已經更新了答案,並提供了一個鏈接,指向Docs的B:Ser教程以及基本示例如何工作的一些解釋。 – quetzalcoatl

+0

謝謝。但是,如果我的課程包含一個矢量>的成員呢? – shn