boost :: property_tree放置用法C ++

时间:2018-09-05 06:10:16

标签: c++ boost ros boost-propertytree ptree

我正在类成员函数中执行ptree.put()

class Writer{
private:
    boost::property_tree::ptree ptree_;
public:
    Writer(){}
    void setData1(string path, string data){
        ptree_.put(path, data);
    }
    void setData2(string path, string data){
        ptree_.put(path, data);
    }
    void printPtree(){
        boost::property_tree::write_json(std::cout, ptree_);
    }
};

我正在创建该类的实例,setData1()由代码中的回调函数(多个ROS订户回调)调用。

当我在setData2()中呼叫main()时,它可以正常工作。但是,当回调调用类似的setData1()时,ptree_最后为空。当我同时执行两个操作时,ptree_仅由setData2()写入数据。

在每次调用时在ptree_内打印setData1()时,可以在ptree_中看到该调用的数据,而不能看到先前调用中写入的数据。调用setData1()时,没有使用printPtree()写入的数据。仅使用setData1()写入的数据保持不变。

我编写了两个相同的setData方法,以便可以清楚地解释我的问题。我在这里做错了什么?


编辑:这是我的代码的最低版本。这是一个ROS节点。

class Writer{
private:
    pt::ptree ptree_;

public:
    Writer(){}

    void setData(string branch, string data){
        ptree_.put(branch, data);
        // gets ptree content at each call
        // pt::write_json(std::cout, ptree_);
    }
    ~Writer(){
        pt::write_json(std::cout, ptree_);
    }
};

class SubscriberHandler{
private:
    ros::Subscriber sub_;
    Writer writer_;
public:
    SubscriberHandler(string topic_name_, Writer & writer) : writer_(writer){
        ros::NodeHandle n;
        sub_ = n.subscribe(topic_name_, 10, &SubscriberHandler::callback, this);
    }
    // this is the ROS callback function
    void callback(const topic_tools::ShapeShifter::ConstPtr& msg){
        --- CODE TO GET DATA FROM msg---
        writer_.setData(path, value);
    }
};

class SomeClass{
    Writer writer;
public:
    SomeClass(){
        writer.setData("Velocity.x", "50");
        writer.setData("Velocity.y", "10.5");
        // I have to create these objects inside a class
        SubscriberHandler sh("my_topic", writer);
    }
};

int main(){
    ros::init("node_name");

    SomeClass sc;

    ros::spin()
    return 0;
}

这是我结尾处的ptree_

{
    "Velocity": {
        "x": "50",
        "y": "10.5"
    }
}

但是如果我在每次通话时打印ptree_,它就会包含在该特定通话+上面发送的数据。由于这似乎是与我的C ++知识有关的问题,因此我在此处发布了该问题,而不是ROS答案。

1 个答案:

答案 0 :(得分:1)

您有两个Writer实例:

  • writer中创建的SomeClass实例的main成员。其中的属性树已设置"Velocity.x""Velocity.y"
  • writer_构造函数中创建的SubscriberHandler实例的SomeClass成员。这是第一个Writer实例的副本(因为SubscriberHandler构造函数已将其复制)。其中的属性树已设置"Velocity.x""Velocity.y"path