我正在尝试编写一个程序来创建一个类,该类包含指向成员函数的指针的 vector,具有 add()
和 remove()
成员函数。
我写的代码是 -
#include <iostream>
#include <vector>
using namespace std;
typedef void(*classFuncPtr)();
class FunctionVectors
{
private:
vector<classFuncPtr> FunctionPointerVector;
public:
FunctionVectors(){}
void add(classFuncPtr funcPtr);
void remove(int index);
void run();
void a(){cout<<"a: Why are you calling me?"<<endl;}
};
void FunctionVectors::add(classFuncPtr funcPtr)
{
FunctionPointerVector.push_back(funcPtr);
}
void FunctionVectors::remove(int index)
{
FunctionPointerVector.erase(FunctionPointerVector.begin() + index);
}
int main()
{
FunctionVectors f;
classFuncPtr fv = &(classFuncPtr)FunctionVectors::a; // error here
f.add(fv);
f.run();
return 0;
}
但是,它在第 32 行显示错误 -
error C2440: 'type cast' : cannot convert from 'void (__thiscall FunctionVectors::* )(void)' to 'classFuncPtr'
请告诉我应该如何修改它才能正常工作。
最佳答案
typedef void(*classFuncPtr)();
这不是指向方法的指针,而是指向函数的指针。方法不同于函数,因为它是在上下文中调用的:需要 this
才能正常工作。
请记住,在 C++ 中,您只能创建指向特定类方法的指针 vector 。因此,您将无法在该 vector 中保留指向不同类的两个方法的指针。
如评论中所建议的,解决方案是使用 std::function
或 boost::function
以及可能的 C++11 lambda,因为它们提供了很多比简单的指向成员的指针更灵活。
如果你想实现一个事件机制,也可以考虑使用仿函数而不是方法:
为事件处理程序创建基类:
class MyEventHandler { public: virtual void operator()(void * sender, int data) = 0; }
创建这些的简单 vector :
std::vector<MyEventHandler *> MyEvent;
在您的类中创建特定的处理程序:
class MyClass { private: class SpecificEventHandler : MyEventHandler { public: void operator()(void * sender, int data) { std::cout << "Event handled!"; } } public: SpecificEventHandler Handler; MyClass() { } }
将处理程序挂接到您的事件:
MyEvent.push_back(&(myClassInstance.Handler));
凭内存写的代码,可能无法编译,但你应该明白了。
关于c++ - 指向成员函数的指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110211/