我正在尝试编写一个程序,该程序创建一个包含add()remove()成员函数的包含指向成员函数的指针向量的类的类。
我写的代码是-

1    #include <iostream>
2    #include <vector>
3   using namespace std;
4
5    typedef void(*classFuncPtr)();
6
7    class FunctionVectors
8    {
9    private:
10      vector<classFuncPtr> FunctionPointerVector;
11    public:
12      FunctionVectors(){}
13      void add(classFuncPtr funcPtr);
14      void remove(int index);
15      void run();
16      void a(){cout<<"a: Why are you calling me?"<<endl;}
17    };
18
19    void FunctionVectors::add(classFuncPtr funcPtr)
20    {
21      FunctionPointerVector.push_back(funcPtr);
22    }
23
24    void FunctionVectors::remove(int index)
25    {
26      FunctionPointerVector.erase(FunctionPointerVector.begin() + index);
27    }
28
29    int main()
30    {
31      FunctionVectors f;
32      classFuncPtr fv = &(classFuncPtr)FunctionVectors::a;
33
34      f.add(fv);
35      f.run();
36
37      return 0;
38  }


但是,它在第​​32行显示错误-

error C2440: 'type cast' : cannot convert from 'void (__thiscall FunctionVectors::* )(void)' to 'classFuncPtr'


请告诉我如何修改它才能正常工作。

提前致谢。

最佳答案

typedef void(*classFuncPtr)();


这不是方法的指针,而是函数的指针。方法与函数不同,因为它是在上下文中调用的:需要this才能正常工作。

请记住,在C ++中,您只能创建指向特定类方法的指针向量。因此,您将无法在该向量中保留指向不同类的两个方法的指针。

正如注释中所建议的那样,解决方案是使用std::functionboost::function以及可能的C ++ 11 lambda,因为它们比简单的指向成员的指针提供了更多的灵活性。

如果要实现事件机制,请考虑也使用函子而不是方法:


创建事件处理程序的基类:

class MyEventHandler
{
public:
    virtual void operator()(void * sender, int data) = 0;
}

创建这些的简单向量:

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/

10-11 22:54