3

C++ で階層データ構造をシリアライズしたいと考えています。私が取り組んでいるプロジェクトはブーストを使用しているためboost::property_tree::ptree、データノード構造として使用しています。

Personのような低レベルの構造のインスタンスを含む高レベルの構造がありますJob(各人には仕事があります)。PersonそしてJobそれぞれがメソッドを実装しptreeifyます。アイデアは、各オブジェクトが含まれている他の各オブジェクトを呼び出すことによって、階層をシリアル化することptreeifyです。結果のサブ オブジェクトのプロパティ ツリーは、それを含むオブジェクトのプロパティ ツリーにノードとして挿入されます。問題は、実際に挿入する方法がわからないことです。

この SO 投稿に従うと、実行時エラーが発生します。何が原因なのかを理解するために必要な知識/経験が不足しています。以下のコードを参照してください。

この非常によく似た質問も見つけましたが、答えがまったくわかりません。使用するとinsert複雑さが回避されるのではないかと思います。

質問: プロパティ ツリーをノードとして別のプロパティ ツリーに挿入するにはどうすればよいですか?

これが実際のコードです。内で実行時エラーが発生しますPerson::ptreeify

#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
using namespace std;

struct Job{
    std::string title;
    int hoursPerWeek;
    ptree ptreeify(void); //return a ptree representing this Job
    };

ptree Job::ptreeify(){
    ptree pt;
    pt.put("title", title);
    pt.put("hours", hoursPerWeek);
    return pt;
    }

struct Person{
    std::string name;
    Job job;
    ptree ptreeify(void); //return a ptree representing this Person
                          //This must iterively call ptreeify on all sub-objects
    void save(const std::string &filename); //write this Person to file
    };

ptree Person::ptreeify(){
    ptree pt;
    pt.put("name", name);
    pt.put("job", "");

    ptree jobPt;
    jobPt = job.ptreeify();
    std::cout << "Program dies after this line" << std::endl;
    //This next line causes a run time error
    pt.insert(pt.get_child("job").begin(), jobPt.begin(), jobPt.end());
    return pt;
    }

void Person::save(const std::string &filename){
    ptree pt;
    pt = ptreeify();
    write_json(filename, pt);
    };

int main(){
    Person myPerson;
    myPerson.name = "Julius";

    Job myJob;
    myJob.title = "monkey";
    myJob.hoursPerWeek = 40;

    myPerson.job = myJob;

    myPerson.save("myPerson.dat");
    }
4

1 に答える 1

8

これは非常に単純であることがわかります。あなたが使うput_child

ptree Person::ptreeify(){
    ptree pt;
    pt.put("name", name);

    ptree jobPt;
    jobPt = job.ptreeify();
    pt.put_child("job", jobPt);
    return pt;
    }
于 2013-06-17T06:41:42.547 に答える