C ++模板类引用自身

时间:2014-04-06 07:30:36

标签: 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 */ };

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

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

注意:无效的C ++代码如下

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

而以下内容也无效:

注意:无效的C ++代码如下

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

2 个答案:

答案 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