创建一个类的成员函数的指针变量指向一个非静态类的成员函数(Creating a class memb

2019-07-29 22:55发布

我们的目标是让成员变量_AddValue点到CreateFirstValue在类的初始化函数的第一次调用后AddValue ,给它的所有未来的调用将调用CreateAnotherValue

以前,我只是有一个单一AddValue功能与条件检查,以确定调用哪个函数。 不过,我觉得这样的实现是有缺陷的,因为if检查将出现每一次,它似乎是一个函数指针将是有益的在这里。

一个例子:

class Foo
{
 private:
  int _value;
  void (*_AddValue)(int value); // Pointer to function member variable

  void CreateFirstValue(int value)
  {
    _value = value;
    _AddValue = &CreateAnotherValue;
  }

  void CreateAnotherValue(int value)
  {
    // This function will create values differently.
    _value = ...;
  }

 public:
  // Constructor
  Foo()
   : _value(0), _AddValue(CreateFirstValue)
  {
  }

  AddValue(int value) // This function is called by the user.
  {
    _AddValue(value);
  }
};

上面的代码是不实际的代码,只是我想要完成一个例子。

现在我得到一个错误: argument of type void (BTree::)(int) does not match void (*)(int)

Answer 1:

&CreateAnotherValue 

此语法是无效的。 要创建一个指针到会员,您必须将类命名,甚至从其他成员的内部。 尝试

&Foo::CreateAnotherValue

在这种情况下,你说一个合格的非静态成员函数,这是允许的,防止不合格有关成员函数的地址错误的地址。

当然,你这时就需要适当类型的变量来存储指针到成员中,看到博的回答正确的声明。 当谈到时间来调用它,你将需要使用指针到成员引用操作(无论是.*->* ),所以说

(this->*_AddValue)(whatever);

该规则同样适用于数据,如果你说&Foo::_value ,你会得到类型的指针到成员int Foo::* 。 但在数据的情况下,不合格的名字也是可以接受的,但具有非常不同的行为。 &_value给出正常指针,类型int* ,这是特定的地址_value内侧部件变量this实例。



Answer 2:

空隙(* _AddValue)(int值); //函数指针成员变量

这是不是一个真正的指针到成员,但指向一个免费的函数。

您需要进行此

void (Foo::*_AddValue)(int value); // Pointer to function member variable


文章来源: Creating a class member pointer function variable that points to a non-static class member function