#include <iostream>


template<class Model, class View>
class Controller
{ /* Implement Controller */
};

template<class Model, class Controller>
class View
{ /* Implement View */
};

class Model
{ /* Implement Model */
};


////////////////////////////////////////////////////////////////////////////////

template<typename M>
class MyView;

template<typename M>
class MyController;

template<typename M>
class MyView : public View<M, MyController<M>>
{
public:
    MyView(M* m) : m_model(m)
    {
    }
    
    void setController(MyController<M>* controller)
    {
        m_controller = controller;
    }
    
    M* m_model;
    MyController<M>* m_controller;
};

template<typename M>
class MyController : public Controller<M, MyView<M>>
{
public:
    MyController(M* m) : m_model(m)
    {
    }
    
    void setView(MyView<M>* view)
    {
        m_view = view;
    }
    
    M* m_model;
    MyView<M>* m_view;
};


class MVC
{
    Model m;
    MyView<Model> v;
    MyController<Model> c;

public:
    MVC() : m(), v(&m), c(&m)
    {
        v.setController(&c);
        c.setView(&v);
    }
};

int main()
{
    MVC mvc;
    
    // TODO: use MVC here
    
    return 0;
}