c++ - boost::property_tree 使用 C++

标签 c++ boost ros boost-propertytree

我正在类成员函数中执行 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 订阅者回调)。

当我在 main() 中调用 setData2() 时,它按预期工作。但是回调调用类似的setData1()时,ptree_最后是空的。当我同时执行这两项操作时,ptree_ 只有 setData2() 写入的数据。

当我在每次调用时在 setData1() 中打印 ptree_ 时,可以在 ptree_ 中看到该调用的数据,但不能在先前调用中写入的数据。当调用 printPtree() 时,没有使用 setData1() 写入的数据。只有使用 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 答案。

最佳答案

你有两个 Writer 实例:

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

关于c++ - boost::property_tree 使用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52178181/

相关文章:

c++ - 分配给在 C++ 中创建的对象

c++ - Boost::Intrusive 中 splay_multiset 的成员 Hook 实现

c++ - 处理大量的 Boost 头文件

c++ - 无法使用 Visual Studio 2015 Pro 构建 boost 1.60

python - ROS 从 python 节点发布数组

c++ - 错误 : no matching function for call to ‘sipqt_gui_cpp_RosPluginlibPluginProvider_ForPlugins::connectNotify(const char*&)’

c++ - 使用带有 C++ 的 SDL 的段错误,尝试 Blit 图像

c++ - 比较图像的相似性

c++ - 与模板方法的接口(interface)

parameter-passing - 将 arg 添加到启动文件