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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |