【发布时间】:2010-07-01 15:17:57
【问题描述】:
c++中有没有办法在变量值改变时自动调用函数?
【问题讨论】:
c++中有没有办法在变量值改变时自动调用函数?
【问题讨论】:
c++中有没有一个函数可以在变量改变时自动调用函数?
不,我想不到。但是,您可以将对变量的访问包装在一个合适的包装器中,这样您就可以挂钩到赋值中。
像这样的:
//Beware, brain-compiled code ahead!
template<typename T>
class assignment_hook {
public:
typedef void (hook_t)(const T& old_value, const T& new_value);
assignment_hook(T& value, hook_t hook) : ref_(value), hook_(hook) {}
T& operator=(const T& rhs)
{
hook_(ref_,rhs);
ref_ = rhs;
}
private:
// I'd rather not want to think about copying this
assignment_hook(const assignment_hook&);
void operator=(const assignment_hook&);
T& ref_;
hook_t hook_;
};
正如诺亚在评论中指出的那样,
typedef boost::function<void(const T&,const T&)> hook_t;
(或者,如果你的编译器有它,std::tr1::function 或std::function)会大大改善这一点,因为它允许调用各种“兼容”函数。 (例如,它可以使用boost/std::/tr1::bind<> 调用成员函数等各种魔法。)
还请注意,正如 adf88 在他的 cmets 中所说,这只是执行所要求的(监视对变量的写访问),绝不是一个成熟的属性实现。事实上,尽管 C++ 的态度是在库中尽可能多地在语言中实现,尽管有很多人(其中一些相当聪明的人)尝试过,但没有人找到在 C++ 中实现属性的方法作为一个库,没有语言的支持。
【讨论】:
一句话;没有。
但是你应该做的是将变量包装到一个类中(我不建议运算符重载),并通过 set(...) 函数对其进行更改。然后你只需从 set 函数中调用该函数。
【讨论】:
detect_changes(&var, my_function_pointer);
您可以将变量设为某个类的私有变量,然后首先使用成员函数进行更改。
您可以将额外代码放入成员函数本身,或者您可以将该代码分开并让成员函数在更改时调用它。
【讨论】:
不,您应该将变量封装在几个 get/set 方法中。
【讨论】:
根据程序的复杂性,您可以使用监听器来监视某些对象的状态变化,并让程序的其他部分订阅来自该监听器的事件。
但是,最好的选择是将此功能放入该变量的 setter 方法中。它可以是侦听器功能,也可以是直接函数调用。
【讨论】:
如果变量具有类类型,则可以重载其operator =() 函数。如果变量是原始类型,则不能这样做。
【讨论】:
您可以封装该变量,并让侦听器在值更改时收到通知。我会选择 boost::signals 或 boost::signals2 :
http://www.boost.org/doc/libs/1_43_0/doc/html/signals2.html
这里有一些关于观察者模式的信息: http://en.wikipedia.org/wiki/Observer_pattern
【讨论】: