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

时间:2012-06-15 19:44:06

标签: c++ class function-pointers

目标是让成员变量_AddValue在类初始化时指向CreateFirstValue函数,并在第一次调用AddValue之后,将来调用它{{1} }}

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

2 个答案:

答案 0 :(得分:15)

&CreateAnotherValue

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

&Foo::CreateAnotherValue

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

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

(this->*_AddValue)(whatever);

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

答案 1 :(得分:7)

  

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

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

你需要做这个

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