1

I want to bind member class event to consumer class function while using composition. Please correct me if description of problem is wrong, I come from C# background.

Here is the code:

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

I want to run Observer::OnStateChanged when Observable call OnStateChanged function.

Alan Stokes
  • 18,815
  • 3
  • 45
  • 64
toomasz
  • 35
  • 2
  • 8

1 Answers1

3

It says &Observable::OnStateChanged for the function you tried to bind... did you mean &Observer::OnStateChanged? Because this works ok:

client.OnStateChanged = std::bind(&Observer::OnStateChanged, this);
Alan Stokes
  • 18,815
  • 3
  • 45
  • 64
ClockworkV
  • 116
  • 2