ParametersHandler::ParametersHandler(
const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent)
{
node_ = parent;
auto node = node_.lock();
node_name_ = node->get_name();
logger_ = node->get_logger();
}
在这段代码中,ParametersHandler::ParametersHandler
是一个构造函数,它接收一个 rclcpp_lifecycle::LifecycleNode::WeakPtr
类型的参数,这个参数是一个弱引用(weak pointer)到一个生命周期节点(LifecycleNode
)。弱引用是一种智能指针,它指向一个对象,但不拥有该对象,因此不会影响对象的生命周期。
auto node = node_.lock();
这行代码的意思是:
-
node_.lock()
: 调用WeakPtr
的lock()
成员函数,尝试获取一个强引用(strong pointer)到所指向的对象。如果原始对象已经被销毁,lock()
将返回一个空的std::shared_ptr
。 -
auto
: C++11 引入的类型推导关键字,它让编译器根据赋值表达式的右侧来自动推导出变量node
的类型。在这个上下文中,node
将被推导为std::shared_ptr
类型,因为lock()
返回的是一个std::shared_ptr
。 -
赋值操作:将
lock()
返回的std::shared_ptr
赋值给局部变量node
。如果node_
指向的对象仍然存在,node
将是一个有效的强引用,可以安全地使用;如果node_
指向的对象已经被销毁,node
将是一个空的std::shared_ptr
。
使用 lock()
的目的是在需要使用原始对象的时候,能够安全地获取一个强引用。由于弱引用本身不拥有对象,所以不能直接使用它来访问对象成员,必须先通过 lock()
获取强引用。
在这个构造函数中,获取强引用后,可以安全地调用 node->get_name()
和 node->get_logger()
来获取节点的名称和日志记录器,因为这些操作需要一个有效的对象引用。