Any problem with attached solution? Andre'
-- Those who desire to give up Freedom in order to gain Security, will not have, nor do they deserve, either one. (T. Jefferson)
#include <iostream> #include <string> class ControllerBase; class ViewBase; class Dialog { public: Dialog() : c_(0), v_(0) {} void controller(ControllerBase * controller) { c_ = controller; } void view(ViewBase * view) { v_ = view; } ControllerBase & controller() { return *c_; } ViewBase & view() { return *v_; } private: ControllerBase * c_; ViewBase * v_; }; class ControllerBase { public: ControllerBase(Dialog & parent) : parent_(parent) {} virtual ~ControllerBase() {} virtual std::string const whoami() const { return "ControlBase"; } protected: Dialog & parent_; }; class ViewBase { public: ViewBase(Dialog & parent) : parent_(parent) {} virtual void printcontroller() {} protected: Dialog & parent_; }; class ControlCitation : public ControllerBase { public: ControlCitation(Dialog & parent) : ControllerBase(parent) {} std::string const whoami() const { return "ControlCitation"; } }; #define citationcontroller() getController<ControlCitation>() class ViewCitation : public ViewBase { public: // doesn't like this // function template "ViewBase::getController" is not a type name // typedef getController<ControlCitation> controller; ViewCitation(Dialog & parent) : ViewBase(parent) {} virtual void printcontroller() { std::cout << "ViewCitation's controller is " << parent_.controller().whoami() << std::endl; } }; int main() { Dialog dialog; dialog.controller(new ControlCitation(dialog)); dialog.view(new ViewCitation(dialog)); dialog.view().printcontroller(); return 0; }