Boost :: Property_tree положить использование C ++ - PullRequest
0 голосов
/ 05 сентября 2018

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

1 Ответ

0 голосов
/ 05 сентября 2018

У вас есть два Writer экземпляра:

  • член writer экземпляра SomeClass, созданного в main. В дереве свойств есть "Velocity.x" и "Velocity.y" set.
  • член writer_ экземпляра SubscriberHandler, созданного в конструкторе SomeClass. Это копия первого экземпляра Writer (поскольку его скопировал конструктор SubscriberHandler). В дереве свойств есть "Velocity.x", "Velocity.y" и path set.
...