c++ - 指向成员函数的指针 vector

标签 c++ vector function-pointers

我正在尝试编写一个程序来创建一个类,该类包含指向成员函数的指针的 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::functionboost::function 以及可能的 C++11 lambda,因为它们提供了很多比简单的指向成员的指针更灵活。

如果你想实现一个事件机制,也可以考虑使用仿函数而不是方法:

  1. 为事件处理程序创建基类:

    class MyEventHandler
    {
    public:
        virtual void operator()(void * sender, int data) = 0;
    }
    
  2. 创建这些的简单 vector :

    std::vector<MyEventHandler *> MyEvent;
    
  3. 在您的类中创建特定的处理程序:

    class MyClass
    {
    private:
        class SpecificEventHandler : MyEventHandler
        {
        public:
            void operator()(void * sender, int data)
            {
                std::cout << "Event handled!";
            }
        }
    
    public:
        SpecificEventHandler Handler;
    
        MyClass()
        {
        }
    }
    
  4. 将处理程序挂接到您的事件:

    MyEvent.push_back(&(myClassInstance.Handler));
    

凭内存写的代码,可能无法编译,但你应该明白了。

关于c++ - 指向成员函数的指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110211/

相关文章:

c++ - 误解了 vector 中的虚函数

r - 当负索引可能是整数(0)时,如何安全地从向量中删除任何内容?

c - C中主下标值错误

c++ - 为什么需要对函数进行 typedef,同时将 void* 转换为函数指针?

c++ - GCC -flto 更改符号可见性

C++ 模板代码导致错误,在显然未正确分配的对象上调用 delete

vector - Agda:Stdlib 中的向量成员资格? (以及一般如何学习 stdlib)

c++ - 二叉搜索树递归析构函数

c++ - 没有模板也能完美转发吗

c - 为什么我不能访问这个 void 类型数组的第二个元素