标头common.h
forward声明一个类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
我想,如果前向声明就足够了,真的无论是否有定义都无关紧要。