Вызов коллбэка-члена класса из другого класса
От: aalp  
Дата: 22.01.09 08:59
Оценка:
Здравствуйте,

Проблема: хочу вызвать член одного класса через указатель в другом классе, не прибегая к передаче в последний объекта первого.

Пытаюсь реализовать вызов члена контроллера из вьюхи, однако столкнулся с проблемой. Насколько я понял, для вызова из одного класса члена другого необходимо иметь инстанс класса, которому принадлежит вызываемый метод. Можно ли как-то этого избежать? В данном случае, хотелось бы, что бы вьюха ничего не знала про контроллер (кроме типа хэндлера, без этого не типизировать коллбэк).

Или есть более грамотный способ реализовать данное поведение? Использовать в качестве коллбэка дружественную функцию или статический член — не вариант.

class Controller;
class IView;
class View;

typedef void(Controller::* OnEventHandler)();

struct IView
{
    virtual void Exec() = 0;
    virtual void SetHandler(OnEventHandler) = 0;
};

struct Controller
{
public:
    Controller(IView* pView)
    {
        pView->SetHandler(&Controller::Handler);
    }

    void Handler()
    {
        std::cout << "Handler from Controller called" << std::endl;
    }
};

struct View : public IView
{
    OnEventHandler  handler;

    virtual void SetHandler(OnEventHandler callback)
    {
        handler = callback;
    }

    virtual void Exec()
    {
        if(handler)
        {
            std::cout << "Handler exist, calling: ";
            handler();
        }
        else
        {
            std::cout << "Handler does not exist" << std::endl;
        }
    }
};

int main()
{
    IView* view = new View();
    Controller c(view);
    view->Exec();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.