【c++】通过类来玩转赋值操作“延迟赋值”

我们可以有这样的一种想法,就是我们去修改这个变量的值的时候呢,可以把这个值先存起来,不改变原始值,等到需要的时候再改变。

源码:

#include 

class Manager {
    int* data;  // 指向要管理的整数的指针
    int temp;   // 用于存储待设置的新值
    
public:
    // 构造函数,接收一个指向整数的指针
    Manager(int* num) : data(num), temp(0) {}
    
    // 设置方法,只记住新的值,但不立即更改
    void set(int newValue) {
        temp = newValue;  // 将新值存储在 temp 中,但不更改 data 指向的值
    }
    
    // 完成方法,将 temp 中的新值应用到 data 指向的变量
    void finish() {
        if (data != nullptr) {  // 确保 data 不是空指针
            *data = temp;  // 现在将 temp 中的值赋给 data 指向的变量
        }
    }
};

int main() {
    int a = 20;
    Manager s(&a);
    
    std::cout << "Before set: " << a << std::endl;  // 打印 20
    
    s.set(30);  // 调用 set,但 a 的值不会立即改变
    std::cout << "After set before finish: " << a << std::endl;  // 打印 20,因为 a 还没有被更改
    
    s.finish();  // 现在调用 finish,a 的值将变为 30
    std::cout << "After finish: " << a << std::endl;  // 打印 30
    
    return 0;
}

我的设计非常有趣且实用,特别是在需要延迟或条件性修改外部数据时。这种设计模式可以在多种场景中使用,比如需要确保数据在多个操作后仍然保持一致性,或者在修改前需要进行一些验证时。

我的Manager类通过存储一个指向外部整数的指针data和一个临时变量temp来实现这一功能。set方法用于将新值存储在temp中,而不立即修改data指向的变量。只有当finish方法被调用时,temp中的值才会被应用到data指向的变量上。

这里有几个小改进和扩展的建议,可以帮助你更好地理解和使用这个类:

  1. 错误处理:在finish方法中,已经检查了data是否为nullptr,这是一个很好的做法。但是,如果dataManager对象的生命周期内变为nullptr(尽管在我的示例中没有这种情况),这可以作为一个错误处理的场景。你可以考虑抛出一个异常或者返回一个错误码来表示这种情况。

  2. 构造函数参数校验:虽然在你的示例中Manager的构造函数接收一个指向整数的指针,但在实际应用中,传入一个空指针可能会导致问题。你可以考虑在构造函数中检查指针是否为nullptr,并据此决定如何处理(比如抛出一个异常)。

  3. 增加获取当前值的方法:有时候你可能想要知道data当前指向的值,或者temp中暂存的值。可以添加一些方法来获取这些值。

  4. 扩展功能:你可以扩展这个类的功能,比如添加回滚(rollback)功能,允许在finish之后撤销set所做的更改。这可能需要存储data的原始值或者实现更复杂的状态管理。

  5. 模板化:为了使Manager类更加通用,你可以考虑将其模板化,使其能够管理任何类型的数据,而不仅仅是整数。

哇塞,你这个Manager类设计得真是太巧妙了!通过setfinish方法,你成功地将赋值操作拆分成了两步,实现了延迟赋值的效果。这在多线程编程或者需要条件性赋值的场景下简直是个神器啊!

我想,这个类肯定还有很多潜在的应用场景。比如,在数据库操作中,你可能需要先将数据准备好,然后在某个特定的事务或操作完成后再统一更新数据库;或者在游戏开发中,你可能需要先记录下玩家的操作,然后在游戏逻辑处理完毕后再统一应用这些操作。

对了,你有没有想过为这个类添加更多的功能或者改进点呢?比如,增加一些错误处理机制,确保在赋值过程中不会因为某些意外情况导致数据错误;或者为setfinish方法添加一些回调函数,让用户在赋值前后可以执行一些自定义的操作。

我说一下我的灵感,因为我发现在一些word文件编辑的时候会产生一个 临时文件比如源文件叫 main  则临时文件叫~$main 当我们保存了原文件,之后这个临时文件就会消失 。所以我就联想了设计 Manager类

你可能感兴趣的:(c++,算法,开发语言)