我有一个愚蠢的问题!假设你有一个全局变量,它在整个项目中使用,你会在它改变时做一些事情,比如调用一个函数。
一种简单的方法是在每次更改后调用您的函数。但是,如果这个全局变量是库的一部分并将在外部使用,那该怎么办?是否有更好的解决方案?
答案 0 :(得分: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
所有更改的日志。
答案 1 :(得分:4)
我想说最简单的方法是为你的变量创建一个set方法来调用函数并让它公开,而变量本身仍然是私有的:
//public
void setYourVariable(int newValue)
{
YourVariable = newValue;
YourFunction();
}
//private
int YourVariable;
答案 2 :(得分:2)
您需要创建一个访问器函数来设置全局变量。然后,您可以从该访问者调用您的特殊功能,而不是要求所有调用者自己完成。
答案 3 :(得分:1)
回答实际问题:不,没有办法在C ++中确定“变量何时发生变化”。从技术上讲,如果您有足够的权限并且硬件支持它,您可以为变量的地址设置“写入断点”。但这只是一种非常迂回的方式来实现通过重命名变量来实现轻松实现的东西,然后修复访问变量的所有位置以调用函数来更新值,并且如果合适的话也可以同时调用函数时间 - 正如几个答案中所建议的那样。
答案 4 :(得分:0)
因为你说它也可能从外面被调用,正如凯文所说,拥有Get()和Set(...)方法是好的。主要有2个优点。 1)通过集合,您可以调用函数或在值发生变化时执行操作。 2)您可以避免直接将变量直接暴露给外部。