Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;MVC模式中的自通知模型 我在C++中实现了MVC模式。我希望我的模型是一个可观察的(或主体),当发生变化时,它会自动通知观察者。出于某种原因,我不希望客户端代码触发通知本身_C++_Model View Controller - Fatal编程技术网

C++;MVC模式中的自通知模型 我在C++中实现了MVC模式。我希望我的模型是一个可观察的(或主体),当发生变化时,它会自动通知观察者。出于某种原因,我不希望客户端代码触发通知本身

C++;MVC模式中的自通知模型 我在C++中实现了MVC模式。我希望我的模型是一个可观察的(或主体),当发生变化时,它会自动通知观察者。出于某种原因,我不希望客户端代码触发通知本身,c++,model-view-controller,C++,Model View Controller,比如说: Model model; View view(m); model['key1'] = 25; // (i) view is notified model['some_vector'] = { 1, 2, 3 }; // (ii) view is notified model['some_vector'].push_back(4); // (iii) view is notified boost::any_cast<std::vector<int>>(model

比如说:

Model model;
View view(m);
model['key1'] = 25; // (i) view is notified
model['some_vector'] = { 1, 2, 3 }; // (ii) view is notified
model['some_vector'].push_back(4); // (iii) view is notified
boost::any_cast<std::vector<int>>(model.update('some_vector')()).push_back(4);
为此,我的模型类将保存这样一个映射:

std::map<std::string, boost::any> m_data;
当您在映射中创建新条目时,这是很好的,但是如果您想要修改非整数类型,如
(iii)
,则它不起作用。事实上,我可以替换这个值,但我不能仅仅更新它

我考虑使用一个临时对象(更新),将值传输到客户端代码,并在销毁时通过回调触发通知,如:

class Update {
  Update(boost::any& value, std::function callback) : 
    m_value(value), m_callback(callback) {}
  ~Update() { m_callback(); }
  boost::any &operator() { return m_value; }
}

Model::update(std::string key) {
  return Update(m_data[key], (*this).notify());
}
(我知道这不是编译,只是为了得到这个想法)

然后我会这样做:

Model model;
View view(m);
model['key1'] = 25; // (i) view is notified
model['some_vector'] = { 1, 2, 3 }; // (ii) view is notified
model['some_vector'].push_back(4); // (iii) view is notified
boost::any_cast<std::vector<int>>(model.update('some_vector')()).push_back(4);
boost::任意_cast(model.update('some_vector')())。向后推(4);
如果我不想通知我的观察者连续更新,我甚至可以通过保持更新对象处于活动状态来模拟事务,只要我的更新没有完成:

{
  Update update = model.update('some_vector');
  boost::any_cast<std::vector<int>>(update()).push_back(4);
  boost::any_cast<std::vector<int>>(update()).push_back(5);
  boost::any_cast<std::vector<int>>(update()).push_back(6);
}
{
Update=model.Update('some_vector');
boost::任意_cast(update())。向后推_(4);
boost::任意_cast(update())。向后推_(5);
boost::任意_cast(update())。将_向后推(6);
}

但是使用任何_类型转换和指定值的类型都非常麻烦。有人知道一种更简洁、更优雅的方法来实现这一点吗?< /P>使用一个真实的类型来存储数据,而不是在C++中幼稚地重新编写动态语言,你能把你的评论转换成答案吗?