我需要创建一个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;
答案 0 :(得分:3)
这会编译:
class MyView;
class MyController: public Controller<Model,MyView>{};
class MyView: public View<Model,MyController>{};
MyController myC;
MyView myV;
但这取决于Controller和/或View的编写方式。
时,MyController在MyController派生时不完整,因此只能使用指针。答案 1 :(得分:1)
你不能这样做。一些让你前进的想法:
仅将模板用于特定成员函数
如果您的课程不需要保存数据成员,您可以写:
template<class Model>
class Controller {
public:
void foo() // does not need View
{ ... }
template<typename View>
void bar(const View& v) // works with a specific View
{ ... }
};
或许Controller
不需要知道View
?
template<class Model> // no dependency on View
class Controller { /* Implement Controller */ };
template<class Model, class Controller>
class View { /* Implement View */ };
// no it works
Controller<MyModel> ctrl;
View<MyModel, Controller<MyModel>> view;
使用界面:
class IController { ... };
class IView { ... };
template<class Model>
class Controller : public IController { /* Implement Controller */ };
template<class Model>
class View : public IView { /* Implement View */ };
从模板类型中导出类型:
class MyView;
class MyController : public Controller<MyModel,MyView> { };
class MyView : public View<MyModel,MyController> { };
您必须注意这个问题:Two template classes being composed of a member of each other