我希望以下完整程序输出数字42
,但输出0
。为什么呢?
#include <iostream>
#include <boost/signals2/signal.hpp>
class TestFunctor {
public:
TestFunctor() : last_received_value(0) {}
void operator()(const int& i) {
last_received_value = i;
};
int last_received_value;
};
int main(int argc, char* argv[]) {
TestFunctor f;
boost::signals2::signal<void(const int& i)> sig;
sig.connect(f);
sig(42);
std::cout << f.last_received_value << std::endl;
return 0;
}
如果main()
被以下内容替换,我会得到预期的输出42
:
int main(int argc, char* argv[]) {
TestFunctor f;
f(42);
std::cout << f.last_received_value << std::endl;
return 0;
}
我怀疑问题是TestFunctor
实例的副本实际上正在连接到信号。我该如何防止这种情况(或甚至可能)?
答案 0 :(得分:2)
您需要通过ref注册回调:
sig.connect(boost::ref(f));
否则,插槽会获得仿函数f
的副本,并且副本会更新。