加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C模板类引用自身

发布时间:2020-12-16 09:51:34 所属栏目:百科 来源:网络整理
导读:我需要创建一个MVC架构,其中View和Controller类都已编写为模板,如下所示: templateclass Model,class Viewclass Controller { /* Implement Controller */ };templateclass Model,class Controllerclass View { /* Implement View */ }; 我也有一个模型类:
我需要创建一个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,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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读