c ++类方法指针作为函数参数

时间:2018-05-29 04:56:13

标签: c++ function pointers

我正在尝试创建一个动态函数指针,指向某些方法我想要保存在数组上的所有方法都返回一个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 :(得分:0)

this -> Serviceunqualified or parenthesized non-static member function

您可能需要::而不是->此外,您需要左侧的类型,而不是变量。

另外,请不要在->周围放置空格。这使得它看起来像是在指定尾随返回类型等。

答案 1 :(得分:0)

你可以试试,使用lambdas。创建类似

的方法
 std::function<void()> getService()

你可以在里面使用:

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

此外,如果您的方法应该使用参数,您可以使用此方法,但将参数添加到返回值和lambda中。 另外,您可以在类方法之外创建lambda,例如:

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

这样,当lambda被调用时,最好使用std :: shared_ptr来保证该对象存在。