9

themoviedb.com から映画情報を取得するアプリケーションを作成しています。情報は JSON ファイルで提供されます。ブースト プロパティ ツリーを使用して情報を保存しようとしています。しかし、少し問題があります。

次のコードで問題を説明します。

#include <vector>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>

using namespace std;
using boost::property_tree::ptree;

class single_t{
    int             sID;
    string          sName;
public:
    void            setID(int ID){sID=ID;}
    int             getID(){return sID;}
    void            setName(string Name){sName=Name;}
    string          getName(){return sName;}
};

typedef vector<single_t*> multiple_t;

class foo{
    string          fTitle;
    multiple_t      fItems;
public:
    string          getTitle(){return fTitle;}
    void            setTitle(string Title){fTitle=Title;}
    multiple_t      getItems(){return fItems;}
    void            setItems(multiple_t Items){fItems = Items;}
    void            setItems(single_t Item){fItems.push_back(&Item);}
};

int main () {
    try{
        string response = "{\"title\":\"Foo\",\"items\":[{\"id\":123,\"name\":\"test1\"},{\"id\":456,\"name\":\"test2\"}]}";

        ptree pt;
        stringstream ss; ss << response;
        read_json(ss, pt);
        foo results;
        results.setTitle(pt.get<string>("title"));
        BOOST_FOREACH(ptree::value_type &v,pt.get_child("items")){
            single_t result;
            result.setID(v.second.get<int>("id"));
            result.setName(v.second.get<string>("name"));
            results.setItems(result);
        }
        cout << "Tilte: " << results.getTitle() << endl;
        cout << "Items:" << endl;
        for (int i=0; i!=results.getItems().size(); i++) {
            cout << "\tID: " << results.getItems()[i]->getID()<< endl;
            cout << "\tName: " << results.getItems()[i]->getName()<< endl;
        }
    }
    catch (exception& e)
    {
        cout << "Exception: " << e.what();
    }

}

しかし、これを実行すると、次の出力が得られます。

Tilte: Foo
Items:
  ID: 456
  Name: test2
  ID: 456
  Name: test2

私が間違っていることを誰かが知っていますか?BOOST_FOREACH コードにあると思います。

PS: LLVM GCC 4.2 コンパイラで Xcode 4.5.2 を使用します。

4

1 に答える 1

5

問題はありませんproperty_tree。問題は、ローカル変数へのポインタをベクトルに格納しようとすることです。値で保存するか、スマート ポインター (たとえばboost::shared_ptr) を使用できます。

問題:

void            setItems(single_t Item){fItems.push_back(&Item);}

この関数の終了後、ローカル変数Itemは破棄されるため、ポインタがぶら下がります。

于 2012-12-20T12:35:44.137 に答える