我需要创建一个 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 */ };
我无法控制模型、 View 和 Controller 类的创建方式。现在,如何实例化 Controller 或 View ?
为了更好地解释这种情况,如果我想使用上面的 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;
}
关于引用自身的 C++ 模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22891174/