更改变量后的C ++自动调用函数

时间:2010-07-01 15:17:57

标签: c++ function

c ++中是否有一个函数,当一个变量被改变时,它会自动调用一个函数?

7 个答案:

答案 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::functionstd::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 =()函数。如果变量是基本类型,则无法执行此操作。