2015-11-01 4 views
1

Я хочу привязать событие класса-члена к функции потребительского класса при использовании композиции. Пожалуйста, исправьте меня, если описание проблемы неверно, я исхожу из фона C#.C++ 0x11 - std :: bind и состав

Вот код:

#include "stdafx.h" 
#include <functional> 
#include <iostream> 

using namespace std::placeholders; 

class Observable 
{ 
public: 
    void Register(std::function<void()> Callback) 
    { 

    } 
    std::function<void()> OnStateChanged; 

    void ChangeState() 
    { 
     std::cout << "DevicioClient::ChangeState" << std::endl; 
     OnStateChanged(); 
    } 
}; 

class Observer 
{ 
    Observable client; 

    void OnStateChanged() 
    { 
     std::cout << "DevicioConsumer::OnStateChanged" << std::endl; 
    } 
public: 
    void Run() 
    { 
    // does work 
     client.OnStateChanged = []{ 
      std::cout << "client.OnStateChanged" << std::endl; 
     }; 
    // doesn't work 
    // OnStateChanged = std::bind(&Observable::OnStateChanged, this); 

     client.ChangeState(); 
    } 
}; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Observer consumer; 
    consumer.Run(); 

    getchar(); 
    return 0; 
} 

Я хочу запустить Observer :: OnStateChanged когда Наблюдаемый вызов OnStateChanged функции.

+0

Почему _tmain вместо основного? Почему _TCHAR вместо char? –

+2

Вы хотите 'std :: bind (& Observable :: OnStateChanged, & client)'. –

+1

@ АндрейБеньковский: Не говоря уже о '#include" stdafx.h "' ... –

ответ

3

Он говорит &Observable::OnStateChanged за функцию, которую вы пытались связать ... Вы имели в виду &Observer::OnStateChanged? Поскольку это работает нормально:

client.OnStateChanged = std::bind(&Observer::OnStateChanged, this); 
+0

Вот что я искал, спасибо! – toomasz

Смежные вопросы