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




Reply via email to