首页 > 解决方案 > 从结构数组调用指向成员的函数

问题描述

我遇到了似乎是语法问题。查看其他 StackOverflow 答案并没有给我一个适用于我的问题的答案。至少不是我能理解的。

我的调度程序类:

#define MAX_TASKS 10

typedef struct taskProps {
    int interval;
    int elapsedTime;
    int (Controller::*taskFunction)(void);
} taskProps;

class TaskScheduler {
public:
    TaskScheduler();
    int setUpdateInterval(int interval);
    int addTask(int interval, int (Controller::*taskFunction)(void));
    int startTimer();
    void clearTasks();
    int checkTasks();

private:
    int numberOfTasks;
    int updateInterval;
    taskProps scheduledTasks[MAX_TASKS];
};

这一切都编译得很好,但问题在于调用此函数中的成员函数指针:

int TaskScheduler::checkTasks(){
    int tasksExecuted = 0;

    for(int i = 0; i < numberOfTasks; i++){
        if(scheduledTasks[i].elapsedTime >= scheduledTasks[i].interval){
            scheduledTasks[i].taskFunction;
            scheduledTasks[i].elapsedTime = 0;
            tasksExecuted++;
        }

        scheduledTasks[i].elapsedTime += updateInterval;
    }

    return tasksExecuted;
}

编译它给了我错误;

../Core/Src/TaskScheduler.cpp:88:22: warning: statement has no effect [-Wunused-value]

其他尝试:

scheduledTasks[i].*taskFunction;
../Core/Src/TaskScheduler.cpp:88:23: error: 'taskFunction' was not declared in this scope


scheduledTasks[i].taskFunction();
../Core/Src/TaskScheduler.cpp:88:35: error: must use '.*' or '->*' to call pointer-to-member function in '((TaskScheduler*)this)->TaskScheduler::scheduledTasks[i].taskProps::taskFunction (...)', e.g. '(... ->* ((TaskScheduler*)this)->TaskScheduler::scheduledTasks[i].taskProps::taskFunction) (...)'

任何人都可以帮助我并解释我在这里缺少哪些知识?

标签: c++pointers

解决方案


当您想调用成员函数指针时,您使用的语法是

(object_of_type_mem_func_pointer_points_to.*function_pointer)(parameters)

或者

(pointer_to_object_of_type_mem_func_pointer_points_to->*function_pointer)(parameters)

不幸的是,(scheduledTasks[i].*taskFunction)()这不起作用,因为taskFunction需要一个Controller对象来调用taskFunction。这需要更像这样的代码:

(controller_object.*(scheduledTasks[i].taskFunction))()

或者

(pointer_to_controller_object->*(scheduledTasks[i].taskFunction))()

推荐阅读