C++ 回调函数语法
可能重复:C++ 回调函数语法,c++,C++,可能重复: 考虑到以下几点: template <class T> class myButtoncb { private: T *ptr; void (T::*cback) (void) } class A { public: void foo(void); }; myButton<A> b; b.cback = &A::foo; 它只是一个函数指针,指向一个返回void且不带参数的函数 我不明白的是,T::的重
考虑到以下几点:
template <class T>
class myButtoncb {
private:
T *ptr;
void (T::*cback) (void)
}
class A
{
public:
void foo(void);
};
myButton<A> b;
b.cback = &A::foo;
它只是一个函数指针,指向一个返回void且不带参数的函数
我不明白的是,T::
的重要性是什么?申报还不够吗
仅与
void(*cback)(void)
?类似,这表示它是一个具有This
指针的成员函数。否则,它将是一个自由函数,不知道它在操作什么对象,也无法访问任何非静态成员函数或成员变量。From
“指向成员函数的指针”的类型与“指向函数的指针”的类型不同吗
是的
我提供给您的有很多关于这个主题的信息。您在那里传递的函数必须在类T(myButtoncb的模板参数)中声明。因此,您可以使用如下函数:
template <class T>
class myButtoncb {
private:
T *ptr;
void (T::*cback) (void)
}
class A
{
public:
void foo(void);
};
myButton<A> b;
b.cback = &A::foo;
A类
{
公众:
void foo(void);
};
我的按钮b;
b、 cback=&A::foo;
< /代码> 1用于发布一个DUPE(即使这不是一个DUPE,它应该是非常明显的从基本C++语法中这意味着什么)这是一个很好的方式来看待它。besworland链接还不错,但实际上没有那么多信息。另外,直接提供信息可以说是。@jogojapan我的回答不仅提供了进一步阅读的链接,还提供了“仅仅声明为void(*cback)(void)还不够吗?”的准确答案@Sergey拜托。。。你的回答基本上是肯定的,*
和T::*
之间有区别,但如果你想知道区别是什么,请访问此常见问题解答。(即使是FAQ也只有几行,关于这个主题的信息也不多。)现在我没有说这有什么问题——我没有投反对票——但这并不是我所说的好答案。@jogojapan我应该在书中的答案信息中添加一些让你满意的信息吗?例如,“Stanley Lippman和Barbara Moo从C++底漆中封装的指针类型,以及指针指向的成员类型”的指针。