头文件common.h
中声明了一个Test
类和一个接收成员函数指针的函数:
class Test;
void func(const Test &t, int (Test::*f)() const, int x, int y);
在源文件
target.cpp
中,我定义了这个函数如下:#include "common.h"
void func(const Test &t, int (Test::*f)() const, int x, int y) {
std::cout << "f: " << (t.*f)() << ", x: " << x << ", y: " << y << std::endl;
}
在我的主文件中,我定义了类Test
并使用函数func
:
class Test {
public:
int example() const { return 1; }
};
#include "common.h"
int main() {
Test t;
func(t, &Test::example, 0xaaaaaaaa, 0xbbbbbbbb);
return 0;
}
显然,这有点棘手,因为成员函数指针有时不仅仅是一个简单的指针。但是结果行为有点压倒性:给定参数
0xaaaaaaaa
和0xbbbbbbbb
将不会正确传递给函数。或者更确切地说,函数func
解释给定的堆栈与调用者在堆栈上推送数据不同。 f
的大小取决于类是仅前向声明还是实际定义。使用Visual Studio 2013编译的输出如下:f: 1, x: 0, y: 2130567168
我认为,如果只需要前向声明,是否提供定义其实并不重要。
0xaaaaaaaa
和0xbbbbbbbb
在Windows调用约定下不能表示为int
(请参见MSDN)。缩小转换会引发未定义的行为。您尝试使用较小的数字了吗? - Mankarse