Указатель на метод класса c ++ как аргумент функции - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь создать динамический указатель на функцию, которая указывает на некоторые методы, все методы, которые я хочу сохранить в массиве, возвращают bool и имеют параметр uint32_t.Функции являются сервисными функциями.Они должны быть динамическими, поэтому при запуске класса конструктор связывает сервисную функцию с объектом, который должен быть вызван извне объекта.

С приведенным ниже кодом я получаю следующую ошибку: Ошибка сборки: ISO C ++ запрещает брать адрес неквалифицированной или заключенной в скобки нестатической функции-члена для формирования указателя на функцию-член.

Я понятия не имею, что делать, чтобы преодолеть эту проблему, любая идея будет принята с благодарностью,спасибо!

//File 1

    typedef bool (*ServiceFunctionsType)(uint32_t);

//File 2

#include "File1.hpp"

extern uint8_t ServiceFunctions_size;
extern ServiceFunctionsType *ServiceFunctions;

void Service_Functions_Setup();

bool SetPtr(ServiceFunctionsType a);
void ClearPtr(uint8_t id);

//File 3

#include "File1.hpp"
ServiceFunctionsType *ServiceFunctions;
uint8_t ServiceFunctions_size = 0;

//File 4
#include "File2.hpp"
#include <stdlib.h>

void Service_Functions_Setup()
{
    ServiceFunctions = NULL;
    if(SERVICE_FUNCTION_POINTER_START_SIZE != 0)
    {
        ServiceFunctions_size = SERVICE_FUNCTION_POINTER_START_SIZE;
        ServiceFunctions = (ServiceFunctionsType*)malloc(sizeof(ServiceFunctionsType)*SERVICE_FUNCTION_POINTER_START_SIZE);
        for(uint8_t i = 0; i < SERVICE_FUNCTION_POINTER_START_SIZE; i++)
        {
            ServiceFunctions[i] = NULL;
        }
    }
}

uint8_t SetServiceFunctionPointer(ServiceFunctionsType a, bool _realloc)
{
    if( ServiceFunctions == NULL )
    {
        ServiceFunctions = (ServiceFunctionsType*)malloc(sizeof(ServiceFunctionsType));
        ServiceFunctions[0] = a;
        return 0;
    }

    for(uint8_t i = 0; i < ServiceFunctions_size; i++)
    {
        if( ServiceFunctions[i] == NULL )
        {
            ServiceFunctions[i] = a;
            return i;
        }
    }

    if(_realloc)
    {
        ServiceFunctions_size++;
        ServiceFunctions = (ServiceFunctionsType*)realloc(ServiceFunctions,sizeof(ServiceFunctionsType)*ServiceFunctions_size);
        ServiceFunctions[ServiceFunctions_size - 1] = a;
        return ServiceFunctions_size - 1;
    }

    return INVALID_SERVICE_FUNCTION_POINTER;
}

void ClearServiceFunctionPointer(uint8_t id)
{
    ServiceFunctions[id] = NULL;
}

//File 5


class MonoStepSequencer
{
    public:
        MonoStepSequencer();
        ~MonoStepSequencer();

        uint8_t ServicePointerID;
        bool Service(uint32_t time);

    private:
};    

//File 6

#include "File2.hpp"


MonoStepSequencer::MonoStepSequencer()
{
    ServicePointerID = SetServiceFunctionPointer(&this -> Service);
}

//This is the function to be called with a pointer
bool MonoStepSequencer::Service(uint32_t time)
{
    //Some Code
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вы можете попробовать использовать лямбды.Создайте метод, подобный

 std::function<void()> getService()

Где вы можете использовать внутри:

return [this](){
    Service();
};

Также, если ваши методы должны использовать аргументы, вы можете использовать этот метод, но добавить аргументы в возвращаемое значение и лямбду.Еще один, вы можете создавать лямбду вне методов класса, например:

[&object]()
{
    object.Service();
}

Таким образом, лучше использовать std :: shared_ptr, чтобы гарантировать, что объект существует, когда вызывается лямбда.

0 голосов
/ 29 мая 2018

this -> Service - это unqualified or parenthesized non-static member function

Возможно, вы имели в виду :: вместо -> Кроме того, вам нужен тип слева, а не переменная.

Также, пожалуйста, не ставьте пробелы вокруг ->.Это выглядит так, как будто вы указываете конечный тип возврата или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...