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:是的,指针应该是一个成员。谁说它是静态的?