2015-01-20 3 views
1

У меня есть класс, который хранит функцию обратного вызова, а другой, на котором имеет функцию-член, что я хочу, чтобы установить в качестве обратного вызова, например:Как установить функцию-член как обратный вызов с использованием зЬй :: BIND

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. Что я здесь делаю неправильно?

EDIT 01/21/2014

Как axalo отметил, что нет никакой ошибки в этом коде (кроме некоторых опечаток). Он компилируется. Но я делаю некоторые тесты, и я получаю странное поведение: Когда я использую «привязку» с «этим» указателем на застройщик, т.е.

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

«это» указатель отличается от фактический указатель на экземпляр класса, в то время как, если я делаю это:

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

И вызов помощника() из экземпляра, я получаю правильный «это» указатель. Правильно ли это поведение? Я не должен доверять значению «этого» указателя в конструкторе?

Спасибо.

ответ

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

Вы правы ... на самом деле это были опечатки ... Я упрощал, потому что исходный код был слишком сложным. Я только что составил код выше. Думаю, мне нужно продолжать искать оригинальный код, я должен что-то игнорировать. Большое спасибо. –