0
//mediafactory.h

class MediaFactory{
public:
        typedef Media* (*funPointer)();
    funPointer somePointer;
}

//mediafactory.cpp

Media* MediaFactory::returnMedia(){

}

当我尝试做

somePointer = returnMedia;

我收到此错误:

1   IntelliSense: a value of type "Media *(MediaFactory::*)()" cannot be assigned to an entity of type "MediaFactory::funPointer"   c:\Users\...\mediafactory.cpp   37

但是,如果我将函数更改为下面的代码,它将编译并工作

Media* returnMedia(){   //without scope

}
4

2 回答 2

3

MediaFactory::returnMedia()是一个非静态成员函数,只能通过MediaFactory.

typedef Media* (*funPointer)();定义一个指向静态或非成员函数的指针,该函数在没有任何对象的情况下被调用。因此,它是一种不同的类型,与指向成员函数的指针不兼容。

如果您不需要它指向成员函数,则将其设为returnMedia()静态或非成员(正如您在问题末尾所指出的那样)。

如果你确实需要它指向一个成员函数,那么你需要一个指向成员的指针:

typedef Media* (MediaFactory::*funPointer)();

可以设置为指向成员函数:

somePointer = &MediaFactory::returnMedia;

并且可以在工厂对象上调用:

Media * media = (someFactory.*somePointer)();

或者,您可能希望在设置指针时将函数指针绑定到对象,而不是在使用它时。在这种情况下,您可以使用std::function(或者boost::function如果您使用过时的编译器)来存储任意可调用对象:

typedef std::function<Media*()> function;
function someFunction;

someFunction = std::bind(&MediaFactory::returnMedia, &someFactory);

Media * media = someFunction();
于 2012-11-16T11:12:34.433 回答
0

如果没有此类的实例,则无法将类的方法分配给全局函数指针。

于 2012-11-16T11:05:54.577 回答