C ++按功能指针错误调用成员函数

时间:2017-04-03 00:37:20

标签: c++ pointers function-pointers member-function-pointers

我正在编写一个离散事件模拟器(DES),其中事件将是用户编程的函数。 我有一个名为UserEvents的类和一个名为Add

的私有成员函数
    void Add(const void *Parameters, void *ReturnValue);

我正在尝试制作一个存储以下结构的向量:

 typedef struct FunctionPointerAlias { std::string FAlias; void(UserEvents::*FPointer)(const void*, void*); };

基于字符串,我想调用不同的函数。因此切换会很好但是切换不能处理字符串(我不想哈希我的字符串)。 所以我用一个struct(字符串Alias,FunctionPointer)创建了一个向量,然后我将迭代我的向量,查找用户输入的字符串,恢复相应的函数指针并调用它。

所有用户函数都应为void类型,接收参数并通过void *指针返回值:

void UserEvents::Add(const void *Parameters, void *ReturnValue)
{
    int *A = (int*)Parameters;
    int *B = A;
    B++;

    int *C = (int*)ReturnValue;
    *C = *A + *B;

    //memcpy(ReturnValue, &C, sizeof(int));
    return;
}

(TL; DR)问题在于我尝试调用函数指针指向的函数。我得到错误“表达式括号前面的表达式必须具有(指向 - ) - 函数类型”在右侧上方的行中返回“添加”if。

    void UserEvents::Choose(const std::string Alias, const void *Parameters, void *ReturnValue)
{
    if (Alias == "Example")
    {
        // *ReturnValue = Function(Parameters)
        return;
    }

    if (Alias == "Add") {
        void (UserEvents::*FunctionPointer)(const void*, void*) = &UserEvents::Add;
        (*FunctionPointer)(Parameters, ReturnValue);
        return;
    }
}

2 个答案:

答案 0 :(得分:1)

我认为通过指针调用该成员函数的语法应该是例如。

( this->*FunctionPointer )( Parameters, ReturnValue );

C ++有两个运算符.*->*,专门用于通过指针访问类成员。这是article on the topic。无处不在的*运算符不适用于类成员指针。

答案 1 :(得分:0)

我不太了解你需要什么,所以我尝试做一些一般的事情,你应该在你自己的班级中使用这个模式:

#include <iostream>
#include <string>

typedef void(*STR_FUNC)(const void*, void*);

struct FUNCTION_POINTER_ALIAS
{
    std::string FAlias;
    STR_FUNC fn;
};

void FN0(const void *Parameters, void *ReturnValue)
{
    std::cout << *(std::string*) Parameters << " FN0" << std::endl;
}

void FN1(const void *Parameters, void *ReturnValue)
{
    std::cout << *(std::string*) Parameters << " FN1" << std::endl;
}

void FN2(const void *Parameters, void *ReturnValue)
{
    std::cout << *(std::string*) Parameters << " FN2" << std::endl;
}

int main()
{
    FUNCTION_POINTER_ALIAS Items[] = {{"str0", FN0}, {"str1", FN1}, {"str2", FN2}};
    for (int i = 0; i < sizeof(Items) / sizeof(FUNCTION_POINTER_ALIAS); ++i)
        Items[i].fn(&Items[i].FAlias, NULL);
}