c++ - 保持对其他类的成员函数的引用
问题描述
我有一个 A 类的实例,它应该在 B 类的另一个实例中注册一个成员回调。我试图在 B 类中保留对 A 类函数的引用,但我得到了一个 Segfault。
类A.h:
std::shared_ptr<classB> mB;
void toBeRegisteredCallback(const uint8_t val);
类A.cpp:
classA::classA(std::shared_ptr<classB> b) :
mB(std::move(b)) {
b->registerCallback(std::bind(&classB::toBeRegisteredCallback, this,
std::placeholders::_1));
}
void classB::toBeRegisteredCallback(const uint8_t val) {
LOG(INFO) << "Received a value callback!";
}
这是classB.h的代码:
public:
void registerCallback(std::function<void(const uint8_t val)> callback);
private:
std::function<void(const uint8_t)> _callback;
这是classB.cpp的代码:
void classB::registerCallback(std::function<void(const uint8_t val)> callback) {
_callback = callback;
}
当我尝试直接调用回调而不分配时,它工作正常:
callback(8)
但是,如果我尝试分配它,我会在functionswap处得到一个段错误
谢谢。
解决方案
考虑你的classA
构造函数......
classA::classA(std::shared_ptr<classB> b)
: mB(std::move(b))
{
b->registerCallback(std::bind(&classB::toBeRegisteredCallback, this,
std::placeholders::_1));
}
的初始化mB
将调用(从这里(项目 10)) ...
shared_ptr( shared_ptr&& r ) noexcept;
从 r 移动构造一个 shared_ptr。构造完成后, *this 包含 r 先前状态的副本,r 为空且其存储的指针为 null。
因此,在下面的声明中......
b->registerCallback(std::bind(&classB::toBeRegisteredCallback, this, std::placeholders::_1));
b
实际上是一个空指针,导致未定义的行为。
推荐阅读
- typescript - Typescript - 将两个动态处理的枚举合并为一个
- java - Tomcat 错误 - 状态码 404,资源不可用
- xml - Open XML 仍然是一回事吗
- android - Firebase 电话身份验证已启用,但应用程序一直说它已禁用;我能做些什么?
- r - 如何查看 R 中类方法的可用参数和文档?
- javascript - 如何从请求 API 获取响应数据 XML?
- jquery - 如何在 node-express 项目中包含引导程序
- sql - 每月合同总数
- python - 如何将较小的子元素合并为列表中较大的父元素?
- xamarin - ABP:FlurlHttpException 涵盖了 UserFriendlyException