如何在restbed的静态请求处理器中访问类成员对象
问题原因
编译报错的核心是静态成员函数不持有类实例的this指针,无法直接访问类的非静态成员变量cortexDrones。你当前将请求处理函数声明为了static类型,自然无法直接操作类实例的成员。
推荐解决方案
restbed的set_method_handler接受的是std::function类型的回调,支持传入带捕获的lambda表达式,我们可以通过捕获类实例指针的方式,绕开静态函数的限制:
1. 修改头文件的handler声明
去掉处理函数的static修饰,改为普通类成员函数:
std::shared_ptr<restbed::Resource> REST_get_test; // 删除static关键字 void get_test_handler(const std::shared_ptr< restbed::Session > session );
2. 注册回调时用lambda捕获类实例
构造函数中注册handler时,不要直接传函数名,通过lambda捕获this指针,将请求转发给成员函数:
REST_get_test = std::make_shared< restbed::Resource >( ); REST_get_test->set_path( "/test" ); REST_get_test->set_method_handler( "GET", [this](const std::shared_ptr<restbed::Session> session){ this->get_test_handler(session); });
可选安全优化
如果你的类实例是通过std::shared_ptr管理,可以让类继承std::enable_shared_from_this,捕获智能指针代替裸this,避免类实例销毁后回调触发悬空指针问题:
// 类定义头文件中修改继承关系 class c_module_home : public std::enable_shared_from_this<c_module_home> { // 原有类定义 }; // 构造函数中注册逻辑改为 auto self = shared_from_this(); REST_get_test->set_method_handler( "GET", [self](const std::shared_ptr<restbed::Session> session){ self->get_test_handler(session); });
注:不推荐通过全局/静态变量存储类实例指针的方案,会引入多实例冲突、线程安全、生命周期管理等隐患。
内容的提问来源于stack exchange,提问作者Robert Driller
相关产品推荐
相关产品推荐

