2014-09-25 2 views
1

42을 출력하려면 다음과 같은 전체 프로그램이 필요하지만, 0을 출력합니다. 왜?부스트 신호 2 신호에서 호출 된 펑터의 멤버 변수가 업데이트되지 않습니다.

int main(int argc, char* argv[]) { 
    TestFunctor f; 
    f(42); 
    std::cout << f.last_received_value << std::endl; 
    return 0; 
} 

나는 문제가 TestFunctor 인스턴스의 복사본이 실제로 신호에 매여되고 있음을 의심 : main()는 다음으로 대체 된 경우

#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; 
} 

, 내가 예상 출력 42를 얻을. 이 문제를 어떻게 방지 할 수 있습니까?

답변

2

당신은 심판에 의해 콜백을 등록해야합니다

sig.connect(boost::ref(f)); 

그렇지 않으면, 슬롯이 펑터 f의 사본을 얻고 복사가 업데이트됩니다.

+0

Perfect. 감사. – Steve