有没有办法将回调附加到C ++对象成员?

时间:2013-12-04 10:25:13

标签: c++

背景信息:我的C ++体验大概是3/10,所以请耐心等待。

我很想知道是否可以将读回调函数附加到C ++对象成员,以便在分配时:

var = object.member;

这会调用一个回调,它会在返回成员之前更新成员。

我可以达到同样的目的
...
var = object.GetMemberVal();
...
int FooClass::GetMemberVal()
{
    // update member value
    return this->member;
}

但是 val = object.member; (没有parens)有点干净,似乎更接近面向对象的精神......我想。

我认为member function as callback可能有关系,但我并非完全关注。

这是否是一个好主意可能有争议,我只是想知道它是否可能。

3 个答案:

答案 0 :(得分:0)

如果我理解你的错误,你可能需要std::bind来使用它:

auto myGetMemberVal = std::bind(&FooClass::GetMemberVal, object);

// ...

int value = myGetMemberVal();  // Actually calls object.GetMemberVal()

std::bind函数创建一个可调用对象,该对象将调用您告诉它的函数。

答案 1 :(得分:0)

Borland C ++ Builder之类的东西叫做property,但它不是标准的C ++特性。

使用标准C ++,您可以创建一个包装成员的模板类,并至少实现这些功能:

  • operator T:用于读取值。 T是成员的类型(例如int)
  • operator =:用于写入值

对于简单的内置类型,它非常简单。

如果您希望该成员只是int并且您只想直接访问它(没有包装器),那么您就无法做到。

答案 2 :(得分:0)

这是否有助于您的事业:

#include <iostream>


typedef int (*func)(int,int);

int f1(int x,int y)
{
  return x+y;
}

class A{

  int _x;
  int _y;
  int _z;

  public:

  A(int num1,int num2):_y(num1),_z(num2){}

  void set ( int (*f)(int x,int y))
  {
    _x = (*f)(_y,_z);
  }

  int get ()
  {
    return _x;
  }

};

int main()
{
  A instance(11,1);
  instance.set(f1);
  std::cout<<instance.get()<<std::endl;
}