Я делаю 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.