从下面的代码中可以看出(作为问题的说明实现),我正在尝试将信号从内部类发送到中间类,中间类会将其中继到外部类。
#include <boost/bind.hpp>
#include <boost/signals2.hpp>
#include <iostream>
class inner {
public:
template <class T>
void register_callback(boost::function<void(T *)> cb, T *obj)
{
sig_inner_.connect(boost::bind(cb, boost::ref(obj)));
}
void trigger()
{
std::cout << "inner" << std::endl;
sig_inner_();
}
private:
boost::signals2::signal<void()> sig_inner_;
};
class mid {
public:
mid() { inner_obj.register_callback<mid>(&mid::handle_sig_mid, this); }
template <class T>
void register_callback(boost::function<void(T *)> cb, T *obj)
{
sig_mid_.connect(boost::bind(cb, boost::ref(obj)));
}
void trigger() { sig_mid_(); }
void inner_trigger() { inner_obj.trigger(); }
void handle_sig_mid()
{
std::cout << "mid" << std::endl;
trigger();
}
private:
boost::signals2::signal<void()> sig_mid_;
inner inner_obj;
};
class outer {
public:
outer() { mid_obj.register_callback<outer>(&outer::handle_sig_outer, this); }
void inner_trigger() { mid_obj.inner_trigger(); }
private:
mid mid_obj;
void handle_sig_outer() { std::cout << "outer" << std::endl; }
};
int main()
{
outer outer_obj;
outer_obj.inner_trigger();
return 0;
}
而不是期望的结果:
inner
mid
outer
运行程序时,实际发生的是:
inner
mid
mid
紧随其后的是崩溃。
我已经注意到处理程序中的“this”地址与我在常规方法中所期望的地址不同,但我不知道如何解决这个问题。
我为此找到的唯一解决方案是将外部类中的信号连接到其处理程序,然后将指针(在本例中为unique_ptr)存储在内部类中,从而避免需要中继它,但感觉不到就像使用信号的安全方式一样。
我是 C++ 的新手,尤其是提升,所以我真的不知道如何以干净和安全的方式从内部类触发外部类中的回调。