属性:使用C++

属性:使用C++,c++,boost,ros,boost-propertytree,ptree,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_.

我正在做一个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_);
    }
};
我正在创建该类的一个实例,代码Multiple ROS subscriber callbacks中的回调函数调用setData1

当我在main中调用setData2时,它会按预期工作。但当回调调用类似的setData1时,ptree_uu在末尾为空。当我同时执行这两项操作时,ptree_uuu仅由setData2写入数据

每次调用时,当我在setData1中打印ptree_uuuu时,可以在ptree_uuuu中看到该调用的数据,但不能看到以前调用中写入的数据。调用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;
}
这是我最后的树

{
    "Velocity": {
        "x": "50",
        "y": "10.5"
    }
}
但是如果我在每次调用时打印ptree_uuu,它就有在该特定调用时发送的数据+上面的数据。因为它似乎是一个与我的C++知识有关的问题,所以我把问题发布在这里而不是ROS回答。

< p>你有两个作者实例:

在main中创建的SomeClass实例的编写器成员。其中的属性树具有Velocity.x和Velocity.y集。 在SomeClass构造函数中创建的SubscriberHandler实例的编写器成员。这是第一个Writer实例的副本,因为SubscriberHandler构造函数复制了它。其中的属性树具有Velocity.x、Velocity.y和路径集。
请尝试创建一个显示给我们的。另外,请和。您首先描述setData1和setData2是如何相似的,并且显然有不同的行为,然后说明它们是相同的。这并不能让事情变得更清楚。请遵循@Someprogrammerdude的建议。您可能正在某处复制Writer对象,并修改副本而不是原始副本。需要更多帮助。我添加了代码的最低版本@AlanBirtles是的,该行为暗示了类似的情况,但我看不出在我的代码中发生这种情况的原因。小心:sh立即超出范围,因此不能保证在对象仍然存在时调用回调。那时它可能已经被摧毁了,我现在拿到了。我问了这么愚蠢的问题。谢谢@Sander@TeshanShanukaJ:最简单的解决方法是让writer_uu成为参考。这意味着您必须担心对象的生命周期,所以像std::shared_ptr这样的东西可能会更好。