Здравствуйте,
Проблема: хочу вызвать член одного класса через указатель в другом классе, не прибегая к передаче в последний объекта первого.
Пытаюсь реализовать вызов члена контроллера из вьюхи, однако столкнулся с проблемой. Насколько я понял, для вызова из одного класса члена другого необходимо иметь инстанс класса, которому принадлежит вызываемый метод. Можно ли как-то этого избежать? В данном случае, хотелось бы, что бы вьюха ничего не знала про контроллер (кроме типа хэндлера, без этого не типизировать коллбэк).
Или есть более грамотный способ реализовать данное поведение? Использовать в качестве коллбэка дружественную функцию или статический член — не вариант.
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();
}