【问题标题】:How to access a public variable of subscriber class in the main function?如何在主函数中访问订阅者类的公共变量?
【发布时间】:2019-08-29 15:35:40
【问题描述】:

我想在我的代码的 main() 函数中访问我在订阅者类中定义的listener::flow_message(一个公共变量)。在下面的代码中,我只是简单地打印了flow_message 参数来显示问题。

我将flow_message 的访问修饰符更改为私有和受保护,但它得到编译错误,我发现在主函数中访问此变量的唯一方法是将其定义为公共。我可以使用以下命令获取一些属性,例如 flow_message 向量的大小:

list.flow_message.size();

但例如,当我想访问flow_message 向量的第一个成员时,使用以下命令会出现分段错误错误。

list.flow_message[0];



// this is my code for subscribing the optical flow data
// using a class for subscriber callback function:

#include<ros/ros.h>
#include<opencv_apps/FlowArrayStamped.h>
#include<opencv_apps/FlowArray.h>
#include<opencv_apps/Flow.h>
#include<opencv_apps/Point2D.h>
#include<vector>
#include<numeric>

using namespace std;

class listener
  {
     public:
     vector<opencv_apps::Flow> flow_message;
     void callback(const opencv_apps::FlowArrayStamped::ConstPtr& msg);

   };

void listener::callback(const opencv_apps::FlowArrayStamped::ConstPtr& msg)
  {
    listener::flow_message = msg->flow;
    ROS_INFO("i got it");
   }

int main(int argc, char **argv)
  {
     ros::init(argc, argv, "dataman");
     ros::NodeHandle n;
     listener list;
     ros::Subscriber sub = n.subscribe("/lk_flow/flows", 1, &listener::callback, &list);
     while(ros::ok())
       {
          cout << "this is it: " << list.flow_message[0] << endl;
          ros::spinOnce();
       }
     return 0;
  }

正如我之前提到的,我的错误是在运行时:

 Segmentation fault (core dumped)

感谢您的帮助或评论...

【问题讨论】:

    标签: c++ class ros subscriber


    【解决方案1】:

    你去获取flow_message[0],但你从不向向量中添加元素。如果向量为空,则flow_message[0] 不存在。

    在向量中添加元素,你应该发布消息。

    但您还应该检查向量中的元素:

    while(ros::ok()) {
        if (list.flow_message.empty()) {
            std::cout << "no messages" << std::endl;
        } else {
            std::cout << "this is it: " << list.flow_message[0] << std::endl;
        }
    
        ros::spinOnce();
    }
    

    【讨论】:

    • 你好纪尧姆。你是对的,添加 if-else 部分解决了这个问题。我使用 empty() 函数检查了它。我发现当我运行节点时,它首先输出 1,过了一会儿,它输出 0。所以在开始运行节点时,变量是空的,这会导致错误。非常感谢您的快速答复!!!!!!!!!很抱歉没有投票,因为我的声望少于 15 个,它不允许我投票。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2021-01-01
    相关资源
    最近更新 更多