应用于 ROS fram 的 C++ 语法问题

问题描述 投票:0回答:1

我写了一个订阅者函数来订阅字符串类型的消息主题。 第一个版本的程序显示提示“Segmentation failure (core dumped)”,无法执行。 然后我按照chatGPT指令修改了程序,第二个版本就可以执行了。

节目如下: ----版本一:

# include "ros/ros.h"
# include "std_msgs/String.h"

class NameSubscriber
{
private:
    ros::Subscriber sub;
    ros::NodeHandle nh;
public:
    NameSubscriber(std::string _topic, int queue_size)
    : nh(ros::NodeHandle()),
    sub(nh.subscribe(_topic, queue_size, &NameSubscriber::Callback, this))
{
}
    
    void Callback(const std_msgs::String::ConstPtr& msg)
    {
        ROS_INFO("### Success get publisher");
        ROS_INFO("I get the message is: %s, at: %f", msg->data.c_str(),ros::Time::now().toSec());
    } 
};

int main(int argc, char **argv)
{
    ros::init(argc, argv, "name_s");
    NameSubscriber name_sub("sub_Anthony",100);
    ros::spin();
    return 0;
}

----版本二(仅显示修改部分):

public:
    NameSubscriber(std::string _topic, int queue_size)
    : nh()
    {
        sub = nh.subscribe(_topic, queue_size, &NameSubscriber::Callback, this);
    }
    
...

我有两个问题:

  1. 为什么会出现“Segmentation failure (core dumped)”的原因?
  2. 我不明白“子”的构建方式有什么不同。

我很感激任何建议。

我修改了构建“子”这个对象的方式。

c++ ros
1个回答
0
投票

第一个版本的问题是类成员按照它们声明的顺序进行初始化,而不是按照它们在初始化列表中出现的顺序进行初始化。

所以,当成员在类中定义时

ros::Subscriber sub;
ros::NodeHandle nh;

然后初始化

NameSubscriber(std::string _topic, int queue_size)
: nh(ros::NodeHandle()),
sub(nh.subscribe(_topic, queue_size, &NameSubscriber::Callback, this))

在初始化

sub
之前,您已经初始化了
nh
,因此
nh.subscribe(...)
是未定义行为。

因此,要使您的第一个版本正常工作,您必须更改声明顺序:

ros::NodeHandle nh;
ros::Subscriber sub;
© www.soinside.com 2019 - 2024. All rights reserved.