我在类成员函数中做一个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答案。 最佳答案
您有两个Writer
实例:
在writer
中创建的SomeClass
实例的main
成员。其中的属性树已设置"Velocity.x"
和"Velocity.y"
。
在writer_
构造函数中创建的SubscriberHandler
实例的SomeClass
成员。这是第一个Writer
实例的副本(因为SubscriberHandler
构造函数已复制它)。其中的属性树已设置"Velocity.x"
,"Velocity.y"
和path
。