2012-12-20 2 views
9

themoviedb.com에서 영화 정보를 가져 오는 응용 프로그램을 빌드하고 있습니다. 정보는 JSON 파일로 제공됩니다. 속성 트리를 사용하여 정보를 저장하려고합니다. 하지만 약간의 문제가 있습니다. 부스트 속성 트리를 사용하여 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 코드에있는 것 같습니다.

추 신 : LLVM GCC 4.2에서 Xcode 4.5.2 사용 4.2 컴파일러.

답변

5

문제는 property_tree이 아니므로 문제는 벡터에 로컬 변수에 포인터를 저장하는 것입니다. 값으로 저장하거나 스마트 포인터 (예 : boost::shared_ptr)를 사용할 수 있습니다.

문제 : 당신이 허상 포인터를 가질 수 있도록

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

이 기능을 종료 한 후, 지역 변수 Item가 파괴됩니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 저는 C++ 코딩을 처음 접했으므로이 문제를 해결할 수 있습니까? –

+0

수정되었습니다. 내가 변경 : 'typedef 벡터 multiple_t;''typedef 벡터 multiple_t;'로 변경하고 나머지 코드를 적절하게 변경했다. 이 방법에 단점이 있습니까? –

+0

@GlennVonk 아니, 귀하의 경우에는 단점이 없습니다. – ForEveR