创建指向非静态类成员函数的类成员指针函数变量

7 c++ function-pointers class

目标是让成员变量_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);
  }
};
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*igt 15

&CreateAnotherValue
Run Code Online (Sandbox Code Playgroud)

此语法无效.要创建指向成员的指针,您必须为该类命名,甚至可以从其他成员内部命名.尝试

&Foo::CreateAnotherValue
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您正在讨论合格的非静态成员函数的地址,这是允许的并且可以防止关于不合格成员函数的地址的错误.

当然,您需要一个适当的类型变量来存储指向成员的指针,请参阅Bo的正确声明的答案.当谈到时间来调用它,你将需要使用指针到成员引用操作(无论是.*->*),所以说

(this->*_AddValue)(whatever);
Run Code Online (Sandbox Code Playgroud)

同样的规则也适用于数据,如果你说&Foo::_value,你得到一个指向成员的指针int Foo::*.但在数据案例中,也接受了不合格的名称,但行为却截然不同. &_value给出一个普通的指针,类型int*,它是实例中特定_value成员变量的地址this.


Bo *_*son 7

  void(*_AddValue)(int value); //指向函数成员变量的指针

这不是指向成员的指针,而是指向自由函数的指针.

你需要做到这一点

void (Foo::*_AddValue)(int value); // Pointer to function member variable
Run Code Online (Sandbox Code Playgroud)