繁体   English   中英

函数指针将无法编译

[英]Pointer to function won't compile

//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

}

MediaFactory::returnMedia()是一个非静态成员函数 ,只能通过MediaFactory的实例进行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();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM