C++中物体改变识别的设计模式?
Design Pattern for object alteration recognition in C++?
我正在寻找一种机械/设计模式,它允许以某种方式设置对象,以便机械师注意到对象是否在某个存在点(例如构造(后被更改。理想情况下,对象也能够获得有关其更改的信息。
我正在想象一种智能指针和/或接口,它记录写入访问权限并将其传达给对象。
可能的用例: 内容已从文件中加载的对象,如果在销毁时发生更改,则应写入文件。
简单来说,您可以实现对象的所有资源库来单独计算写入访问次数。
class A
{
string filename;
unsigned int altered;
int m_a, m_b, M_c;
public:
A(string filename) : filename(filename), altered(0) { /* parse file */ }
~A() { if(altered) {/* write out to file */} }
void setA(int a) {altered++; m_a = a}
void setB(int b) {altered++; m_b = b}
void setC(int c) {altered++; m_c = c}
};
我觉得这很难维护,也不是很优雅。此外,这种解决方案对于其他类型的对象也不是很便携。
我认为没有一个简单的通用解决方案,因为您需要做出许多决定。例如,在您的代码中,altered
即使a==m_a
.在某些情况下,这可能是正确的事情,但在其他情况下则不然。无论如何,这里有一些简单的东西,可以让您选择在成员被修改时要做什么:
#include <iostream>
using namespace std;
template <typename T>
struct modification_tracking {
using clean_up_t = void(*)(const T&);
modification_tracking(const T& t,clean_up_t clean_up) :
t(t), clean_up(clean_up) {}
~modification_tracking(){ if(modified) clean_up(t); }
void set(const T& v){
modified = t != v;
t = v;
}
private:
T t;
clean_up_t clean_up;
bool modified = false;
};
struct foo {
modification_tracking<int> member{ 1, [](const int& x){ std::cout << x << 'n';}};
};
int main() {
foo f1;
foo f2;
f1.member.set(3);
}
也许带有自定义删除器的智能指针可以以更好的方式执行相同甚至更多操作。如果对象是轻量级的,您甚至可以考虑存储原始对象并在超出范围时进行比较。或者计算哈希值。真的有太多的选择;)
我想不出任何模式可以以某种方式神奇地识别文件已更改; 除非您发现从文件中制作哈希然后比较哈希是可以接受的。在某些时候,您将不得不更改类的状态,以便它写入更改后的文件。这可以通过多种方式完成。
您可以实现的一件事是modify
函数,它更改类的状态,并为用户提供更改类的可变版本的选项。
void modify(const std::function<void(Mutable_A&)>& modifier) // Implemented in A
{
modifier(/* the internal stucture */);
this->writeFile = []{/* write out to file */}; // Then called in destructor
}
然后从外部调用,如下所示
a.modify([](auto& a){
a.m_a = 2;
a.m_b = 3;
a.setA(2); // If set is prefered
});
这样就不必添加任意altered
计数器。您还可以检查modifier
回调是否实际更改,并且仅在更改某些内容时才分配writeFile
。在这种情况下,set
函数只能在Mutable_A
中实现。至于如何称呼这种模式,我不知道。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 用于在回调中调用解析器的设计模式
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 工厂设计模式优化
- 使用C++模板的数据映射器设计模式
- 为什么以及如何使用原型设计模式
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 在C++中创建观察器设计模式的好方法
- 现代C++在多大程度上消除了对设计模式的需求?
- 对于存储另一个类所需信息的类,例如其构造,是否有设计模式?
- 下面抽象工厂设计模式的实现是正确的吗
- sql记录集函数的状态设计模式
- 是否有可以处理方法调用依赖关系的设计模式?
- 使用 C++ 设计模式