C++ 指向函数won';不编译

C++ 指向函数won';不编译,c++,C++,当我试着去做 //mediafactory.h class MediaFactory{ public: typedef Media* (*funPointer)(); funPointer somePointer; } //mediafactory.cpp Media* MediaFactory::returnMedia(){ } 我得到这个错误: somePointer = returnMedia; 但是,如果我将函数更改为下面的代码,它将编译并工作 1

当我试着去做

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

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

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

MediaFactory::returnMedia()是一个非静态成员函数,并且只能通过
MediaFactory的实例调用

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

如果不需要它指向成员函数,则将
returnMedia()
设为静态或非成员(如问题末尾所述)

如果确实需要它指向成员函数,则需要指向成员的指针:

Media* returnMedia(){   //without scope

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

typedef Media* (MediaFactory::*funPointer)();
并且可以在factory对象上调用:

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

Media * media = (someFactory.*somePointer)();
typedef std::function;
功能;功能;
someFunction=std::bind(&MediaFactory::returnMedia,&someFactory);
媒体*Media=someFunction();

MediaFactory::returnMedia()
是一个非静态成员函数,只能通过
MediaFactory
的实例调用

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

如果不需要它指向成员函数,则将
returnMedia()
设为静态或非成员(如问题末尾所述)

如果确实需要它指向成员函数,则需要指向成员的指针:

Media* returnMedia(){   //without scope

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

typedef Media* (MediaFactory::*funPointer)();
并且可以在factory对象上调用:

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

Media * media = (someFactory.*somePointer)();
typedef std::function;
功能;功能;
someFunction=std::bind(&MediaFactory::returnMedia,&someFactory);
媒体*Media=someFunction();

您似乎对类中的全局(“普通”)函数和成员函数之间的区别深感困惑。后者有一个隐藏的
参数,这就是两者不兼容的原因。您需要将
MediaFactory::returnMedia
设置为一个静态方法。您似乎对全局(“普通”)函数和类中成员函数之间的区别深感困惑。后者有一个隐藏的
参数,这就是两者不兼容的原因。您需要将
MediaFactory::returnMedia
设置为静态方法。谢谢。我花了几个小时,但你的answrr消除了99%的混乱。为什么趣味指针是静态指针?如果我在类中使用int random,那么它应该是一个成员变量否?@thuantinh:是的,指针应该是一个成员。谁说它是静态的?谢谢。我花了几个小时,但你的answrr消除了99%的混乱。为什么趣味指针是静态指针?如果我在类中使用int random,那么它应该是一个成员变量否?@thuantinh:是的,指针应该是一个成员。谁说它是静态的?