c ++中是否有一个函数,当一个变量被改变时,它会自动调用一个函数?
答案 0 :(得分:13)
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在他的评论中所说,这只是做了所要求的(监视对变量的写访问),并不是一个完整的属性实现。事实上,尽管C ++的态度尽可能地在库中实现并尽可能少地在语言中实现,并且尽管许多人(其中一些人相当聪明)尝试过,但没有人找到在C ++中实现属性的方法。 作为库,没有语言支持。
答案 1 :(得分:9)
总之一句话;号
但是你应该做的是将变量包装到一个类中(我不打算建议运算符重载),并通过set(...)函数进行更改。然后你只需从set函数调用该函数。
答案 2 :(得分:3)
您可以将变量设置为某个类的私有,然后首先使用成员函数进行更改。
您可以将额外的代码放入成员函数本身,或者您可以将该代码分开并让成员函数在更改时调用它。
答案 3 :(得分:2)
不,你应该将变量封装在几个get / set方法中。
答案 4 :(得分:1)
根据程序的复杂程度,您可以使用监听某些对象进行状态更改的监听器,并让程序的其他部分为该监听器的事件订阅。
但是,最好的选择是将此功能放入该变量的setter方法中。它可以是监听器功能,也可以是直接函数调用。
答案 5 :(得分:0)
您可以封装该变量,并拥有在值更改时得到通知的侦听器。我会选择boost :: signals或boost :: signals2:
http://www.boost.org/doc/libs/1_43_0/doc/html/signals2.html
以及观察者模式的一些信息: http://en.wikipedia.org/wiki/Observer_pattern
答案 6 :(得分:0)
如果变量具有类类型,则可以重载其operator =()
函数。如果变量是基本类型,则无法执行此操作。