目标是让成员变量_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
Run Code Online (Sandbox Code Playgroud)&CreateAnotherValue
此语法无效.要创建指向成员的指针,您必须为该类命名,甚至可以从其他成员内部命名.尝试
&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.
void(*_AddValue)(int value); //指向函数成员变量的指针
这不是指向成员的指针,而是指向自由函数的指针.
你需要做到这一点
void (Foo::*_AddValue)(int value); // Pointer to function member variable
Run Code Online (Sandbox Code Playgroud)