Vector of pointer to member functions

c++, function-pointers, vector

Solution

typedef void(*classFuncPtr)();

This is not a pointer to method, but a pointer to function. Method differs from function, because it's being called in a context: requires `this` to work correctly.

Keep in mind, that in C++ you are only able to create vector of pointers to a method of specific class. So you won't be able to keep pointers to two methods of different classes in that vector.

The solution - as suggested in comments - is to use `std::function` or `boost::function` and possibly C++11 lambdas, because they provide a lot more flexibility than simple pointer-to-members.

If you want to implement an event mechanism, consider also using functors instead of methods:

Create base class for event handler:

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

Create simple vector of these:

std::vector<MyEventHandler *> MyEvent;

Create specific handlers in your classes:

class MyClass
{
private:
    class SpecificEventHandler : MyEventHandler
    {
    public:
        void operator()(void * sender, int data)
        {
            std::cout << "Event handled!";
        }
    }

public:
    SpecificEventHandler Handler;

    MyClass()
    {
    }
}

Hook the handler to your event:

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

Code written from memory, may not compile, but you should get the idea.

Problem

I'm trying to write a program which creates a class that contains vector of pointers to member functions, with `add()` and `remove()` member functions. The code I wrote is - ``` #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; } ``` But, it is showing error in line# 32 - ``` error C2440: 'type cast' : cannot convert from 'void (__thiscall FunctionVectors::* )(void)' to 'classFuncPtr' ``` Please, tell me how should I modify it to work properly.

Original source