c ++中的函数指针

时间:2012-03-23 09:36:14

标签: c++

我正在尝试使用函数指针,我收到此错误:

无法从void (__thiscall MyClass::*)(void)转换为void (__cdecl *)(void)

// Header file - MyClass.h
class MyClass
{
public:
    MyClass();
    void funcTest();
protected:
    void (*x)();
};


// Source file 
#include "stdafx.h"
#include "MyClass.h"

MyClass::MyClass()
{
    x = funcTest;
}

void MyClass::funcTest()
{

}

(使用:Visual Studio 6)

任何人都可以注意到我错过的任何内容吗?

5 个答案:

答案 0 :(得分:5)

非静态成员函数的类型不是void (*)()。它是void (MyClass::*)(),这意味着您需要将x声明为:

void (MyClass::*x)();

x = &MyClass::funcTest; //use fully qualified name, must use & also

答案 1 :(得分:4)

您正在尝试将成员函数指针指定给独立函数指针。你不能互换地使用这两个,因为成员函数总是隐含地将this指针作为它们的第一个参数。

void (*x)();

声明指向独立函数的指针,而funcTest()MyClass的成员函数。

你需要像这样声明一个成员函数指针:

void (MyClass::*x)();

有关详细信息,请参阅the C++ FAQ

答案 2 :(得分:4)

这是因为成员函数与普通函数不同,因此函数指针是不同的。因此,您需要告诉编译器您需要MyClass函数指针,而不是正常的函数指针。您需要将x声明为:void (MyClass::*x)();

答案 3 :(得分:1)

您声明一个指向函数的指针,该函数不接受任何参数并返回void。但是您尝试为其分配成员函数指针。您将需要声明一个指向成员函数指针的指针并获取其地址,如下所示:&MyClass::funcTest此指针的类型为void (MyClass::*)()查看function pointer tutorials

答案 4 :(得分:1)

是的x的类型定义错误。您需要将其定义为编译器建议的成员函数指针,即void(MyClass::*x)()

http://www.parashift.com/c++-faq-lite/pointers-to-members.html