7

目标是在类初始化时让成员变量_AddValue指向函数,并且在第一次调用之后,所有未来对它的调用都将调用。CreateFirstValueAddValueCreateAnotherValue

以前,我只有一个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)

4

2 回答 2

15
&CreateAnotherValue

此语法无效。要创建指向成员的指针,您必须为类命名,即使是从其他成员内部。尝试

&Foo::CreateAnotherValue

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

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

(this->*_AddValue)(whatever);

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

于 2012-06-15T20:02:31.703 回答
7

  无效(*_AddValue)(整数值);// 指向函数成员变量的指针

这实际上不是指向成员的指针,而是指向自由函数的指针。

你需要做这个

void (Foo::*_AddValue)(int value); // Pointer to function member variable
于 2012-06-15T19:55:42.993 回答