首页 > 解决方案 > 用于保留功能状态的对象与静态变量

问题描述

我有一个函数可以处理作为序列出现的数据。因此,我需要知道当前函数调用期间最后一次函数调用的某些变量的值。

我目前的做法是使用静态变量。我的功能是这样的:

bool processData(Object message){
    static int lastVar1 = -1;

    int curVar1 = message.var1;
    if (curVar1 > lastVar1){
        // Do something
    }

    lastVar1 = curVar1;
}

这只是代码的一小部分;实际上,我有 10 多个静态变量跟踪不同的事物。我的直觉告诉我使用这么多静态变量可能不是一个好主意,尽管我没有什么可以支持这种感觉。

我的问题:有没有更好的方法来做到这一点?

我一直在研究的另一种方法是使用字段为 lastVar1、lastVar2 等的对象。但是,我不确定将对象保存在内存中是否比使用静态变量更有效。

标签: c++objectstatic

解决方案


你的问题有一种纯粹关于风格和观点的味道,尽管有些方面不是意见问题:多线程和测试。

考虑一下:

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;
 }

推荐阅读