//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
}
答案 0 :(得分: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();
答案 1 :(得分:0)
如果没有此类的实例,则无法将类的方法分配给全局函数指针。