#include <iostream>  // 包含标准输入输出流功能
#include <memory>  // 包含智能指针等内存管理功能
#include <string>  // 包含标准字符串功能

#include "rclcpp/rclcpp.hpp"  // 包含ROS 2 C++客户端库的核心功能
#include "std_msgs/msg/string.hpp"  // 包含标准消息类型std_msgs::msg::String的定义

// 定义一个订阅者节点类，继承自rclcpp::Node
class SubscriberNode : public rclcpp::Node {
public:
    // 构造函数
    SubscriberNode() : Node("sub_node") {  // 调用父类构造函数，设置节点名称为"sub_node"
        // 创建一个订阅者对象，用于订阅"chatter"话题上的std_msgs::msg::String类型的消息
        // 参数：话题名称、队列大小、回调函数
        subscription_ = this->create_subscription<std_msgs::msg::String>(
            "chatter", 10, std::bind(&SubscriberNode::topic_callback, this, std::placeholders::_1));
    }

private:
    // 定义回调函数，用于处理接收到的消息
    void topic_callback(const std_msgs::msg::String::SharedPtr msg) {
        // 使用RCLCPP_INFO宏打印日志信息，输出接收到的消息内容
        RCLCPP_INFO(this->get_logger(), "Received: '%s'", msg->data.c_str());
    }

    // 定义订阅者对象的智能指针
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

int main(int argc, char *argv[]) {
    // 初始化ROS 2节点，传入命令行参数
    rclcpp::init(argc, argv);
    // 创建SubscriberNode节点的共享指针
    auto node = std::make_shared<SubscriberNode>();
    // 启动节点的事件循环，处理订阅消息等事件
    rclcpp::spin(node);
    // 关闭ROS 2节点
    rclcpp::shutdown();
    return 0;  // 程序正常结束返回0
}

