2012-01-04 5 views
1

私は論文を整理するコードを見ています。私は閉じ込めとポインタを介して相互に接続された2つのクラス(著者と論文)を持っています。私は両方のクラスのシリアル化を定義しましたが、他のクラスに関する情報を破棄すればオブジェクトを保存できます。私は完全にオブジェクトシリアライゼーションに新しいですし、私は私が行くことができる限り私が行っていると感じています。オブジェクトへのポインタベクトルを使ったブースト(C++ - linux)

Author.h

... 
#include <fstream> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 

class Paper; 

class Author 
{ 
    public: 
     friend class Paper; 

     Author(const std::string& last_name_in = "", 
     const std::string& first_name_in = "", 
     const std::string& middle_name_in = ""); 
     ... 

    private: 
     friend class boost::serialization::access; 
     template<class Archive> 
     void serialize(Archive & ar, const unsigned int version) 
     { 
      ar & first_name; 
      ar & last_name; 
      ar & middle_name; 
      ar & display_name; 
      for (int ii = 0; ii < list_of_papers.size(); ii++) 
       ar & list_of_papers[ii]; 
     } 
     ... 
     std::string first_name; 
     std::string last_name; 
     std::string middle_name; 
     std::string display_name; 
     std::vector<const Paper*> list_of_papers; 
}; 

それは意味がないように私は、Paper.hでデフォルトコンストラクタを持っていないと私は本当に私はそれで行く方法がわかりません。 Paper.h

... 
class Author; 

class Paper 
{ 
    public: 
     friend class Author; 
     Paper(const std::string& paper_title_in, 
     const std::vector<Author*>& paper_authors_in); 
     ... 

    private: 
     friend class boost::serialization::access; 
     template<class Archive> 
     void serialize(Archive & ar, const unsigned int version) 
     { 
      ar & paper_title; 
      for (int ii = 0; ii < paper_authors.size(); ii++) 
       ar & paper_authors[ii]; 
     } 

     std::string   paper_title; 
     std::vector<Author*> paper_authors; 
}; 

TEST.CPP:Linuxの

int main() 
{ 
    std::ofstream ofs("filename"); 
    { 
     Author author1("Doe", "John"); 
     Author author2("Dude", "Jim", "J"); 
     std::vector<Author*> list_of_authors; 
     list_of_authors.push_back(&author1); 
     Paper other_paper("A Nice Paper", list_of_authors); 
     list_of_authors.push_back(&author2); 
     Paper this_is_my_paper("What a beautiful paper", list_of_authors); 
     boost::archive::text_oarchive oa(ofs); 
     oa << author1; 
    } 
    { 
     Author author_new; 
     std::ifstream ifs("filename"); 
     boost::archive::text_iarchive ia(ifs); 
     ia >> author_new; 
    } 

    return 0; 
} 

、Iは、G ++でコンパイル:

上記の形態、コードで
g++ -o test -I /path/boost/ -L /path/boost/ -lboost_serialization test.cpp author.cpp paper.cpp 

コンパイルせず、私に巨大なメッセージを与えます。オブジェクトのシリアライゼーションを追加する前にコンパイルされ、 'ar & list_of_papers [ii];を削除するとコンパイルされます。 Author.hから。

誰かが私が逃しているものを見ることができますか?

+0

私はあなたのブーストLIBS – Arunmu

+0

への完全なパスを提供していないと思うあなたはエラーを投稿できますメッセージ – Lars

答えて

0
ar & paper_authors; 

ブーストは、オブジェクトのSTLコンテナをシリアル化することができますので、直接動作するはずですが、オブジェクト自体はserialisable CF提供される:http://www.boost.org/doc/libs/1_35_0/libs/serialization/doc/tutorial.html#stl

+0

paper_authors は、作成者へのポインタのベクトルです。何も変わらないの? – Kroust

+0

@lezebulonによって提案された変更を行いました。私も追加しました #include 最後に、list_of_papersを からstd :: vector list_of_papersに変更しました。 〜 std :: vector list_of_papers; とすべて正常に動作します。 constポインタを保存/ロードできないということですか?または、より洗練されたトリックが必要ですか? とにかく助けてくれてありがとう。 – Kroust

関連する問題