Подайте функция член на обекти като аргумент (указател на функция)

Имам указател към обект „eventHandler“, който има функция член „HandleButtonEvents“:

Аз го наричам така:

eventHandler->HandleButtonEvents();

Сега искам да предам указател към член-функцията 'HandleButtonEvents()' на класа 'EventHandler' като аргумент към друг обект 'obj' като в този Stackoverflow пример:

ClassXY obj = ClassXY(eventHandler->HandleButtonEvents);

Конструкторът се декларира така:

ClassXY(void(*f)(void));

Компилаторът ми казва:

грешка: невалидно използване на нестатична членска функция

какво правя грешно


person C.P.    schedule 03.11.2016    source източник
comment
Указателите към нестатични членски функции не са същите като указател към нечленуваща функция. Препоръчвам ви да разгледате std::function и std::bind вместо това.   -  person Some programmer dude    schedule 03.11.2016
comment
Трябва да е void(DecltypeEventHandler::*f)(void).   -  person skypjack    schedule 03.11.2016
comment
@skypjack: не мога да използвам това, защото не мога да включа типа в този клас (include-loop). Ето защо се опитвам да използвам указателя на функцията...   -  person C.P.    schedule 03.11.2016
comment
@C.P. Е, указател към функция и указател към членска функция са наистина различни зверове.   -  person skypjack    schedule 03.11.2016
comment
@skypjack: Добре. Промених въпроса. Имам нужда от указател към членска функция (на друг обект)   -  person C.P.    schedule 03.11.2016
comment
@C.P. За да бъде използваем указател към член, C++ трябва да знае на какво е член. Ако всъщност не можете да предоставите това, тогава ще трябва да направите своя клас и/или неговия конструктор template.   -  person Olipro    schedule 03.11.2016


Отговори (1)


Използвайки std::function и std::bind, както е предложено в моя коментар, го прави много лесно:

#include <iostream>
#include <functional>

class ClassXY
{
    std::function<void()> function;

public:
    ClassXY(std::function<void()> f)
        : function(f)
    {}

    void call()
    {
        function();  // Calls the function
    }
};

class Handler
{
public:
    void HandleButtonEvent()
    {
        std::cout << "Handler::HandleButtonEvent\n";
    }
};

int main()
{
    Handler* handler = new Handler;

    ClassXY xy(std::bind(&Handler::HandleButtonEvent, handler));

    xy.call();
}

Вижте тук за пример на живо.

person Some programmer dude    schedule 03.11.2016