c++ - 用于保留功能状态的对象与静态变量
问题描述
我有一个函数可以处理作为序列出现的数据。因此,我需要知道当前函数调用期间最后一次函数调用的某些变量的值。
我目前的做法是使用静态变量。我的功能是这样的:
bool processData(Object message){
static int lastVar1 = -1;
int curVar1 = message.var1;
if (curVar1 > lastVar1){
// Do something
}
lastVar1 = curVar1;
}
这只是代码的一小部分;实际上,我有 10 多个静态变量跟踪不同的事物。我的直觉告诉我使用这么多静态变量可能不是一个好主意,尽管我没有什么可以支持这种感觉。
我的问题:有没有更好的方法来做到这一点?
我一直在研究的另一种方法是使用字段为 lastVar1、lastVar2 等的对象。但是,我不确定将对象保存在内存中是否比使用静态变量更有效。
解决方案
你的问题有一种纯粹关于风格和观点的味道,尽管有些方面不是意见问题:多线程和测试。
考虑一下:
bool foo(int x) {
static last_val = -1;
bool result = (x == last_val);
last_val = x;
return result;
}
您可以从多个线程同时调用此函数,但它不会达到预期的效果。此外,您只能通过断言它做正确的事情来测试该函数:
foo(1);
assert( foo(1) ); // silenty assumes that the last call did the right thing
要设置测试(第一行)的先决条件,您已经必须假设这样foo(1)
做是正确的,这在某种程度上违背了在第二行中测试调用的目的。
如果方法需要当前对象和前一个对象,只需传递两者:
bool processData(const Object& message,const Object& previous_message){
if (message.var1 > previous_message.var1){
// Do something
return true;
}
return false;
}
当然,这只是将跟踪上一条消息的问题转移给了调用者,尽管这很简单并且不需要搞乱静态:
Object message, old_message;
while ( get_more( message )) {
processData(message, old_message);
old_message = message;
}
推荐阅读
- whitespace - SSH命令用目录中的下划线替换/转换图像文件中的空格
- python - 如何使用 Tensorflow 和 FIFOQueue 处理数据流
- python - Pandas 数据框交叉引用查询
- c - 为什么 GetComputerNameEx 没有用数据填充缓冲区
- javascript - 更改道具时反应表重新渲染不起作用
- angular - 如何在 Mac 上使用 Visual Studio Code 将 Azure 发布设置文件导入 Angular 项目?
- sql - 如何处理 SQL Server 2008 R2 中的特殊字符
- ruby-on-rails - 将 Rails API 与 ActiveStorage DirectUpload 和 Ember JS 一起使用
- json - 无法在 Array ionic 中设置 JSON 对象
- angular - 编辑时,如何仅以角度 2+ 反应形式发送编辑/更改的字段?