好吧,我认为标题足够描述(但令人困惑,抱歉)。
我正在阅读这个图书馆:Timer1。
在头文件中有一个指向函数的公共成员指针,如下所示:
class TimerOne
{
public:
void (*isrCallback)();
};
存在一个TimerOne类的实例化对象,称为" Timer1"。
Timer1按如下方式调用该函数:
Timer1.isrCallback();
这是怎么回事?我熟悉通过使用dereference运算符通过函数指针调用函数。
前:
(*myFunc)();
所以我希望通过对象的上述调用更像是:
(*Timer1.isrCallback)();
那么,通过函数指针调用函数的可接受选项是什么,作为对象的独立函数指针和成员?
答案 0 :(得分:5)
您不必取消引用函数指针来调用它。根据标准([expr.call] / 1),
后缀表达式应具有 函数类型或指向函数类型的指针。
因此(*myFunc)()
有效,myFunc()
也是如此。事实上,(**myFunc)()
也是有效的,你可以根据需要多次取消引用(你能弄明白为什么吗?)
答案 1 :(得分:4)
使用函数指针可以执行的操作。
1:第一个是通过显式取消引用来调用该函数:
int myfunc(int n)
{
}
int (*myfptr)(int) = myfunc;
(*myfptr)(nValue); // call function myfunc(nValue) through myfptr.
2:第二种方式是隐式取消引用:
int myfunc(int n)
{
}
int (*myfptr)(int) = myfunc;
myfptr(nValue); // call function myfunc(nValue) through myfptr.
正如您所看到的,隐式解除引用方法看起来就像一个普通的函数调用 - 这是您所期望的,因为函数只是可以隐式转换为函数指针!!
在您的代码中:
void foo()
{
cout << "hi" << endl;
}
class TimerOne
{
public:
void(*isrCallback)();
};
int main()
{
TimerOne Timer1;
Timer1.isrCallback = &foo; //Assigning the address
//Timer1.isrCallback = foo; //We could use this statement as well, it simply proves function are simply implicitly convertible to function pointers. Just like arrays decay to pointer.
Timer1.isrCallback(); //Implicit dereference
(*Timer1.isrCallback)(); //Explicit dereference
return 0;
}
答案 2 :(得分:1)
你问:
Timer1
调用该函数如下:Timer1.isrCallback();
这是怎么回事?
Timer1.isrCallback
的类型为void (*)()
。它是一个指向函数的指针。这就是为什么你可以使用这种语法。
类似于使用:
void foo()
{
}
void test_foo()
{
void (*fptr)() = foo;
fptr();
}
您也可以使用:
void test_foo()
{
void (*fptr)() = foo;
(*fptr)();
}
但第一种形式同样有效。
更新,以回应OP的评论
鉴于您将使用的类的已发布定义:
(*Timer1.isrCallback)();
使用
(Timer1.*isrCallback)();
isrCallback
必须定义为非成员变量,其类型是指向成员变量TimerOne
的指针。
void (TimerOne::*isrCallback)();
示例:
#include <iostream>
class TimerOne
{
public:
void foo()
{
std::cout << "In TimerOne::foo();\n";
}
};
int main()
{
TimerOne Timer1;
void (TimerOne::*isrCallback)() = &TimerOne::foo;
(Timer1.*isrCallback)();
}
输出:
In TimerOne::foo();
如果您想将isrCallbak
定义为TimerOne
的成员变量,则需要使用:
#include <iostream>
class TimerOne
{
public:
void (TimerOne::*isrCallback)();
void foo()
{
std::cout << "In TimerOne::foo();\n";
}
};
int main()
{
TimerOne Timer1;
Timer1.isrCallback = &TimerOne::foo;
// A little complicated syntax.
(Timer1.*(Timer1.isrCallback))();
}
输出:
In TimerOne::foo();