功能指针 - 编译时间错误

时间:2012-08-09 14:55:44

标签: c++ function-pointers pointer-to-member

我是功能指针的新手,我希望得到你的帮助。 我有一个方法:

int test3(int i)
{
    return i;
}

然后在另一种方法(不是主要的)中我做:

int (*pTest3)(int) = test3;

从我看过的例子来看,这似乎没问题。 但是,我收到编译时错误:

  

testFile.cpp:277:25:error:类型为'int的参数   ({anonymous} :: CheckingConsumer ::)(int)'与'int(*)(int)不匹配'

我不明白出了什么问题。任何帮助将不胜感激。

非常感谢。

2 个答案:

答案 0 :(得分:6)

您的test3structclass的成员函数。类成员函数有一个隐藏的this参数传递给它们,因此不能与普通函数指针一起使用。您需要将函数声明为static或将其移到struct / class之外,以便它不再具有隐藏的this参数,或使用类方法指针而不是函数指针:

// static class method:
class X
{
    static int test3(int i)
    {
        ...
    }
};

// Non-class method, at global scope
int test3(int i)
{
    ...
}

// Class method pointer
class X
{
    int test3(int i)
    {
        ...
    }
};

// Create the method pointer
int (X::*pTest3) = &X::test3;
X *obj;
// Call the method pointer on an object
(obj ->* pTest3)(42);

答案 1 :(得分:0)

您的方法test3似乎是一种实例方法。稍后您将pTest3定义为函数指针,而不是成员函数指针。

简单指针和成员指针之间的主要区别在于使用成员指针需要对象的实例。对象的一个​​实例告诉应该处理哪个对象,指针的值告诉应该使用对象的哪个数据字段或应该调用哪个成员函数。成员指针的值在概念上等同于从对象的开头到其成员的偏移量。

使用typedef:

声明成员指针
typedef int (SomeClass::*MyMethodPtr)(int i);
MyMethodPtr ptr3 = SomeClass::test3;

现在使用这个指针:

class SomeClass *pab = &ab;
int ret_value = (pab->*ptr3)(4);

请注意,使用了该类的实例。关于成员指针还有其他重要的一点。它们被实现为包含2到5个简单指针和偏移的结构,具体取决于编译器和其他方面,如多重继承,存在vitrual基类等。