引用自身的 C++ 模板类

标签 c++ templates model-view-controller self-reference

我需要创建一个 MVC 架构,其中 View 和 Controller 类都已经被编写为模板,如下所示:

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

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

我还有一个模型类:

class Model { /* Implement Model */ };

我无法控制模型、 View 和 Controller 类的创建方式。现在,如何实例化 Controller 或 View ?

为了更好地解释这种情况,如果我想使用上面的 View 和 Model 类创建一个 Controller(不允许我使用任何其他类),我得到:

注意:后面是无效的 C++ 代码

Controller< Model, View< Model, // ad infinitum

而以下也是无效的:

注意:后面是无效的 C++ 代码

Controller< Model, View< Model, Controller > > c;

最佳答案

这是一个可能的实现

template<typename View, typename Model>
struct Controller {
    View *view;
    Model *model;

    Controller() : view(0), model(0) {}
    void setUp(View *v, Model *m) {
        view = v;
        model = m;
    }

    virtual void change() = 0;
};

template<typename Controller, typename Model>
struct View {
    Controller *controller;
    Model *model;

    View() : controller(0), model(0) {}
    void setUp(Controller *c, Model *m) {
        controller = &c;
        model = &m;
    }

    virtual void display() = 0;
};

要进行实例化,诀窍是从模板派生一个类,该模板具有一个前向声明的类作为参数:

struct MyModel {
    int x;
    MyModel(int x) : x(x) {}
};

struct MyController;
struct MyView : View<MyController, MyModel>
{
    void display() { std::cout << model->x << std::endl; }
};

struct MyController : Controller<MyView, MyModel>
{
    void change() { model->x = 44; }
};

之后您可以创建实例并设置它们

int main(int argc, const char *argv[]) {
    MyModel m(42);
    MyView v;
    MyController c;
    v.setUp(&c, &m); c.setUp(&v, &m);

    v.display();
    c.change();
    v.display();

    return 0;
}

关于引用自身的 C++ 模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22891174/

相关文章:

C++ 容器选择/选择

c++ - 使用非 const 构造 const 对象

c++ - 解决使用静态多态性的构造函数问题

parsing - 扩展模板解析器 : CodeIgniter. .. 嵌套数组问题

asp.net-mvc - asp.net MVC 3 中 View 模型的范围

c++ - 参数包是否有设定限制?

c++ - 在 C++ 中实现泛型堆栈

c++ - 为什么 C++ 不尝试使用第二个模板重载?

model-view-controller - 访问模型中的 Symfony 用户 session (Doctrine)

java - RequestMethod POST 和 GET 在同一个 Controller 中?