#include <iostream>
#include <memory>
class Controller;
class View {
public:
~View() {
std::cout << "Disposing View" << std::endl;
}
void SetObserver(std::shared_ptr<Controller> a_observer) {
observer = a_observer;
}
private:
std::shared_ptr<Controller> observer;
};
class Controller : public std::enable_shared_from_this<Controller> {
public:
static std::shared_ptr<Controller> Create(std::unique_ptr<View> view) {
//Can't use std::make_shared due to visibility rules :(
auto controller = std::shared_ptr<Controller>(new Controller(std::move(view)));
controller->Init();
return controller;
}
~Controller() {
std::cout << "Disposing Controller" << std::endl;
}
private:
std::unique_ptr<View> view;
explicit Controller(std::unique_ptr<View> a_view) : view(std::move(a_view)) {}
Controller(const Controller&) = delete;
void Init() {
view->SetObserver(shared_from_this());
}
};
int main() {
auto view = std::make_unique<View>();
auto controller = Controller::Create(std::move(view));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgQ29udHJvbGxlcjsKCmNsYXNzIFZpZXcgewpwdWJsaWM6Cgl+VmlldygpIHsKCQlzdGQ6OmNvdXQgPDwgIkRpc3Bvc2luZyBWaWV3IiA8PCBzdGQ6OmVuZGw7Cgl9CgkKCXZvaWQgU2V0T2JzZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPENvbnRyb2xsZXI+IGFfb2JzZXJ2ZXIpIHsKCQlvYnNlcnZlciA9IGFfb2JzZXJ2ZXI7Cgl9CnByaXZhdGU6CglzdGQ6OnNoYXJlZF9wdHI8Q29udHJvbGxlcj4gb2JzZXJ2ZXI7Cn07CgpjbGFzcyBDb250cm9sbGVyIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q29udHJvbGxlcj4gewpwdWJsaWM6CglzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPENvbnRyb2xsZXI+IENyZWF0ZShzdGQ6OnVuaXF1ZV9wdHI8Vmlldz4gdmlldykgewoJCS8vQ2FuJ3QgdXNlIHN0ZDo6bWFrZV9zaGFyZWQgZHVlIHRvIHZpc2liaWxpdHkgcnVsZXMgOigKCQlhdXRvIGNvbnRyb2xsZXIgPSBzdGQ6OnNoYXJlZF9wdHI8Q29udHJvbGxlcj4obmV3IENvbnRyb2xsZXIoc3RkOjptb3ZlKHZpZXcpKSk7CgkJCgkJY29udHJvbGxlci0+SW5pdCgpOwoJCQoJCXJldHVybiBjb250cm9sbGVyOwoJfQoJCgl+Q29udHJvbGxlcigpIHsKCQlzdGQ6OmNvdXQgPDwgIkRpc3Bvc2luZyBDb250cm9sbGVyIiA8PCBzdGQ6OmVuZGw7Cgl9CnByaXZhdGU6CglzdGQ6OnVuaXF1ZV9wdHI8Vmlldz4gdmlldzsKCQoJZXhwbGljaXQgQ29udHJvbGxlcihzdGQ6OnVuaXF1ZV9wdHI8Vmlldz4gYV92aWV3KSA6IHZpZXcoc3RkOjptb3ZlKGFfdmlldykpIHt9CgkKCUNvbnRyb2xsZXIoY29uc3QgQ29udHJvbGxlciYpID0gZGVsZXRlOwoJCgl2b2lkIEluaXQoKSB7CgkJdmlldy0+U2V0T2JzZXJ2ZXIoc2hhcmVkX2Zyb21fdGhpcygpKTsKCX0KfTsKCmludCBtYWluKCkgewoJYXV0byB2aWV3ID0gc3RkOjptYWtlX3VuaXF1ZTxWaWV3PigpOwoJCglhdXRvIGNvbnRyb2xsZXIgPSBDb250cm9sbGVyOjpDcmVhdGUoc3RkOjptb3ZlKHZpZXcpKTsKCQoJcmV0dXJuIDA7Cn0=