目标是让成员变量_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);
}
};
答案 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