其他分享
首页 > 其他分享> > C模板类引用自身

C模板类引用自身

作者:互联网

我需要创建一个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 */ };

我无法控制如何创建Model,View和Controller类.现在,如何实例化控制器或视图?

为了更好地解释这种情况,如果我想使用上面的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;
}

标签:self-reference,c,templates,model-view-controller
来源: https://codeday.me/bug/20190728/1562962.html