2012-08-09 98 views
1

我是新来的函数指针,我想你的帮助。 我有一个方法:在另一种方法(不是主要的)我做函数指针 - 编译时间错误

int test3(int i) 
{ 
    return i; 
} 

然后:

int (*pTest3)(int) = test3; 

从我读这似乎确定的例子。 不过,我得到一个编译时错误:

testFile.cpp:277:25: error: argument of type ‘int ({anonymous}::CheckingConsumer::)(int)’ does not match ‘int (*)(int)’

我不明白什么是错的。任何帮助,将不胜感激。

非常感谢。

+3

函数是一个类成员函数吗?这个错误似乎表明它是....如果你想创建一个成员函数指针,它有点不同。 – jcoder 2012-08-09 14:59:54

+1

它没有问题。从你的文件的大小(至少277行)来看,还有其他可能导致这种情况的东西('CheckingConsumer'?),你上面没有提到。 – 2012-08-09 15:04:07

+2

如果在你的问题中可以包含一个*完整的*,但显示你的问题的最简单的例子将是有帮助的。在这里,我们必须仔细阅读各行,以推断'test3'确实是'CheckingConsumer'的成员,这使得问题难以回答。 – Flexo 2012-08-09 15:04:51

回答

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); 
+0

非常感谢回复。它使用static关键字。但是,这是否会影响程序呢? – Soc 2012-08-09 15:18:26

+0

@ user1491620'static'使得它不适用于您班级的实例,这会显着改变其意义。 – Flexo 2012-08-09 15:32:04

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个简单指针和偏移量的结构,这取决于编译器和其他方面,如多重继承,虚拟基类的存在等。