boost::property_tree 使用 C++
boost::property_tree put usage C++
我正在 class 成员函数中执行 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_);
}
};
我正在创建 class 的实例,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
。
我正在 class 成员函数中执行 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_);
}
};
我正在创建 class 的实例,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
。