2015-01-20 4 views
1

를 사용하여 콜백과 같은 멤버 함수를 설정하는 방법이 이런 내가 콜백로 설정할 멤버 함수를 가지고있는에 함수 콜백을 저장하는 클래스, 또 다른 :표준 : 바인드

using namespace std::placeholders; 

class A { 
    typedef std::function<void(int)> Callback; 
    Callback callback; 
    A() {} 
    A(Callback f) : callback(f); 
    do_something(int x) { callback(x); } 
} 

class B { 
    A a; 
    void function(int x) { printf("%d", x); } 
    B() 
    { 
     a = A(std::bind(&B::function, this, _1)); 
    } 

이 작업을 수행하고 콜백 함수를 호출하려고하면 MSVC에서 잘못된 함수 호출 오류가 발생합니다. 여기서 내가 뭘 잘못하고 있니?

axalo으로 2014년 1월 21일

편집 (떨어져 오타에서)이 코드에 오류가없는, 지적했다. 그것은 컴파일됩니다. 하지만 난 몇 가지 테스트를하고 있어요, 나는 이상한 행동을 받고 있어요 : 나는 즉, 생성자의 '이'포인터와 '바인딩'을 사용하는 경우,

B() { a = A(std::bind(&B::function, this, _1)); } 

'은행'포인터가 다르다 클래스의 인스턴스에 대한 실제 포인터, 나는이 할 경우 상태 : 인스턴스에서()

void helper() = { a = A(std::bind(&B::function, this, _1)); } 
B() { } 

및 통화 도우미, 내가 올바른 '이'포인터를 얻을. 이 동작이 정확합니까? 나는 생성자에서 'this'포인터의 값을 신뢰해서는 안된다.

감사합니다.

답변

5

질문에있는 코드가 컴파일되지 않습니다. 그러나 일부 구문 오류 등을 수정 한 후에 코드가 실제로 컴파일됩니다.

using namespace std::placeholders; 

class A 
{ 
public: 
    typedef std::function<void(int)> Callback; 
    Callback callback; 

    A() {} 

    A(Callback f) : callback(f) {} 

    void do_something(int x) 
    { 
     callback(x); 
    } 
}; 

class B 
{ 
    A a; 

    void function(int x) 
    { 
     printf("%d", x); 
    } 

    B() 
    { 
     a = A(std::bind(&B::function, this, _1)); 
    } 
}; 

어디에서 오류가 발생했는지 알아 보려면 코드와 비교하십시오.

+0

당신이 맞습니다 ... 사실 오타가 있습니다 ... 원래 코드가 너무 복잡하기 때문에 단순화했습니다. 방금 위의 코드를 컴파일했습니다. 원래 코드를 계속 살펴 봐야 할 것 같아요, 뭔가를 간과해야합니다. 고마워. –