通过 object 和 public 函数成员指针的 C++ 函数调用,不使用取消引用运算符
C++ Function call via an object with public member pointer to function, without using dereference operator
好吧,我认为标题已经足够描述了(但令人困惑,抱歉)。
我正在阅读这个图书馆:Timer1。
在header文件中有一个public成员指针指向一个函数如下:
class TimerOne
{
public:
void (*isrCallback)(); // C-style ptr to `void(void)` function
};
存在 TimerOne class 的实例化 object,称为“Timer1”。
Timer1调用函数如下:
Timer1.isrCallback();
这怎么正确?我熟悉使用取消引用运算符通过函数指针调用函数。
例如:
(*myFunc)();
所以我希望通过 object 进行的上述调用更像是:
(*Timer1.isrCallback)();
那么,通过函数指针调用函数的可接受选项是什么,因为 stand-alone 函数指针 和 [=54] 的成员=]?
另请参阅:
- [很有用!]Typedef function pointer?
答案总结:
这些都是调用函数指针的有效且良好的方法:
myFuncPtr();
(*myFuncPtr)();
(**myFuncPtr)();
(***myFuncPtr)();
// etc.
(**********************************f)(); // also valid
你可以用函数指针做的事情。
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;
}
您不必取消引用函数指针即可调用它。根据标准([expr.call]/1),
The postfix expression shall have
function type or pointer to function type.
所以(*myFunc)()
是有效的,myFunc()
也是有效的。事实上,(**myFunc)()
也是有效的,你可以任意多次取消引用(你能找出原因吗?)
你问过:
Timer1
calls the function as follows:
Timer1.isrCallback();
How is this correct?
Timer1.isrCallback
的类型是void (*)()
。它是一个指向函数的指针。这就是您可以使用该语法的原因。
这类似于使用:
void foo()
{
}
void test_foo()
{
void (*fptr)() = foo;
fptr();
}
您还可以使用:
void test_foo()
{
void (*fptr)() = foo;
(*fptr)();
}
但第一种形式同样有效。
更新,回应 OP
的评论
鉴于发布的 class 定义,您将使用:
(*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();
好吧,我认为标题已经足够描述了(但令人困惑,抱歉)。
我正在阅读这个图书馆:Timer1。
在header文件中有一个public成员指针指向一个函数如下:
class TimerOne
{
public:
void (*isrCallback)(); // C-style ptr to `void(void)` function
};
存在 TimerOne class 的实例化 object,称为“Timer1”。
Timer1调用函数如下:
Timer1.isrCallback();
这怎么正确?我熟悉使用取消引用运算符通过函数指针调用函数。
例如:
(*myFunc)();
所以我希望通过 object 进行的上述调用更像是:
(*Timer1.isrCallback)();
那么,通过函数指针调用函数的可接受选项是什么,因为 stand-alone 函数指针 和 [=54] 的成员=]?
另请参阅:
- [很有用!]Typedef function pointer?
答案总结:
这些都是调用函数指针的有效且良好的方法:
myFuncPtr();
(*myFuncPtr)();
(**myFuncPtr)();
(***myFuncPtr)();
// etc.
(**********************************f)(); // also valid
你可以用函数指针做的事情。
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;
}
您不必取消引用函数指针即可调用它。根据标准([expr.call]/1),
The postfix expression shall have function type or pointer to function type.
所以(*myFunc)()
是有效的,myFunc()
也是有效的。事实上,(**myFunc)()
也是有效的,你可以任意多次取消引用(你能找出原因吗?)
你问过:
Timer1
calls the function as follows:Timer1.isrCallback();
How is this correct?
Timer1.isrCallback
的类型是void (*)()
。它是一个指向函数的指针。这就是您可以使用该语法的原因。
这类似于使用:
void foo()
{
}
void test_foo()
{
void (*fptr)() = foo;
fptr();
}
您还可以使用:
void test_foo()
{
void (*fptr)() = foo;
(*fptr)();
}
但第一种形式同样有效。
更新,回应 OP
的评论鉴于发布的 class 定义,您将使用:
(*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();