3

我有一个愚蠢的问题!假设您有一个在整个项目中使用的全局变量,并且当它发生变化时您将做一些事情,例如调用一个函数。
一种简单的方法是在每次更改后调用您的函数。但是,如果这个全局变量是库的一部分并且将在外部使用怎么办。有没有更好的解决方案?

4

5 回答 5

8

大概你想找到你的变量何时被修改,而不需要追踪对它的引用并重写所有依赖它的代码。

为此,请将您的变量从现在的任何内容更改为重载的类类型operator=,并在发生更改时打印/记录/任何更改。例如,假设您当前拥有:

int global;

并想知道何时更改global

class logger { 
     int value;
public:
    logger &operator=(int v) { log(v); value= v; return *this; }

    // may need the following, if your code uses `+=`, `-=`. May also need to 
    // add `*=`, `/=`, etc., if they're used.
    logger &operator+=(int v) { log(value+v); value += v; return *this; }
    logger &operator-=(int v) { log(value-v); value -= v; return *this; }
    // ...

    // You'll definitely also need:
    operator int() { return value; }
};

并将 替换为int global;logger global;获取对 的所有更改的日志global

于 2013-02-01T19:04:58.963 回答
4

我想说最简单的方法是为调用函数的变量创建一个 set 方法并让它公开,而变量本身保持私有:

//public
void setYourVariable(int newValue)
{
    YourVariable = newValue;
    YourFunction();
}
//private 
int YourVariable;
于 2013-02-01T18:40:49.823 回答
2

您需要创建一个访问器函数来设置全局变量。然后,您可以从该访问器调用您的特殊函数,而不是要求所有调用者自己做。

于 2013-02-01T18:40:17.983 回答
1

只是为了回答实际问题:不,没有办法确定 C++ 中的“变量何时更改”。从技术上讲,如果你有足够的权限并且硬件支持它,你可以为你的变量的地址设置一个“写断点”。但这只是一种非常迂回的方法,可以通过重命名变量来轻松实现,然后修复访问变量的所有位置以调用函数来更新值,如果合适的话还可以同时调用函数时间 - 正如几个答案中所建议的那样。

于 2013-02-01T18:43:55.093 回答
0

由于您说它也可能从外部调用,正如 Kevin 所说,拥有 Get() 和 Set(...) 方法很好。主要有2个优点。1)通过集合,您可以在值更改时调用函数或执行操作。2)您可以避免直接将变量直接暴露在外部。

于 2013-02-01T18:59:04.270 回答