我有两节课。我想将
this
从一个类的构造函数作为参数传递给另一个类的构造函数。
我知道发生错误是因为在 IkArm 对象(this)完全构造之前调用了shared_from_this()。但我无法找到在执行第一个类后将节点传递给第二个类的方法。我也经历过this问题,但那里使用的类的关系是不同的。
以下是代码:
#include "rclcpp/rclcpp.hpp"
class IkSolver
{
public:
IkSolver(std::shared_ptr<rclcpp::Node> node) : node_(node)
{
RCLCPP_INFO(node_->get_logger(), "2nd Constructor");
}
private:
std::shared_ptr<rclcpp::Node> node_;
};
class IkArm : public rclcpp::Node
{
public:
IkArm() : Node("IkNode")
{
RCLCPP_INFO(this->get_logger(), "1st Constructor");
obj1_ = std::make_shared<IkSolver>(shared_from_this());
RCLCPP_INFO(this->get_logger(), "Back To 1st Constructor");
}
private:
std::shared_ptr<IkSolver> obj1_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<IkArm>());
rclcpp::shutdown();
return 0;
}
我收到以下错误:
[INFO] [1720452645.004303274] [IkNode]: 1st Constructor
terminate called after throwing an instance of 'std::bad_weak_ptr'
what(): bad_weak_ptr
[ros2run]: Aborted
你不能从构造函数调用
shared_from_this
,你只能在已经绑定到shared_from_this
的对象上调用shared_ptr
,该对象在其构造函数完成后绑定到shared_ptr
。
来自 std::enable_shared_from_this
仅允许在先前共享的对象上调用shared_from_this 对象,即由 std::shared_ptr 管理的对象。否则, std::bad_weak_ptr 被抛出(由来自 a 的 shared_ptr 构造函数 默认构造的weak-this)。
您需要将成员的构造放在您调用的另一个方法中在构造函数之外。
rclcpp::spin(std::make_shared<IkArm>()->init());
// init implemenation
std::shared_ptr<IkArm> init()
{
obj1_ = std::make_shared<IkSolver>(shared_from_this());
return shared_from_this();
}