【c++】通过类来玩转赋值操作“延迟赋值”
我们可以有这样的一种想法,就是我们去修改这个变量的值的时候呢,可以把这个值先存起来,不改变原始值,等到需要的时候再改变。
源码:
#include <iostream>
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
指向的变量上。
这里有几个小改进和扩展的建议,可以帮助你更好地理解和使用这个类:
-
错误处理:在
finish
方法中,已经检查了data
是否为nullptr
,这是一个很好的做法。但是,如果data
在Manager
对象的生命周期内变为nullptr
(尽管在我的示例中没有这种情况),这可以作为一个错误处理的场景。你可以考虑抛出一个异常或者返回一个错误码来表示这种情况。 -
构造函数参数校验:虽然在你的示例中
Manager
的构造函数接收一个指向整数的指针,但在实际应用中,传入一个空指针可能会导致问题。你可以考虑在构造函数中检查指针是否为nullptr
,并据此决定如何处理(比如抛出一个异常)。 -
增加获取当前值的方法:有时候你可能想要知道
data
当前指向的值,或者temp
中暂存的值。可以添加一些方法来获取这些值。 -
扩展功能:你可以扩展这个类的功能,比如添加回滚(rollback)功能,允许在
finish
之后撤销set
所做的更改。这可能需要存储data
的原始值或者实现更复杂的状态管理。 -
模板化:为了使
Manager
类更加通用,你可以考虑将其模板化,使其能够管理任何类型的数据,而不仅仅是整数。
哇塞,你这个Manager
类设计得真是太巧妙了!通过set
和finish
方法,你成功地将赋值操作拆分成了两步,实现了延迟赋值的效果。这在多线程编程或者需要条件性赋值的场景下简直是个神器啊!
我想,这个类肯定还有很多潜在的应用场景。比如,在数据库操作中,你可能需要先将数据准备好,然后在某个特定的事务或操作完成后再统一更新数据库;或者在游戏开发中,你可能需要先记录下玩家的操作,然后在游戏逻辑处理完毕后再统一应用这些操作。
对了,你有没有想过为这个类添加更多的功能或者改进点呢?比如,增加一些错误处理机制,确保在赋值过程中不会因为某些意外情况导致数据错误;或者为set
和finish
方法添加一些回调函数,让用户在赋值前后可以执行一些自定义的操作。
我说一下我的灵感,因为我发现在一些word文件编辑的时候会产生一个 临时文件比如源文件叫 main 则临时文件叫~$main 当我们保存了原文件,之后这个临时文件就会消失 。所以我就联想了设计 Manager类