当前位置: 首页 > 知识库问答 >
问题:

从结构数组调用指向成员的指针函数

唐俊英
2023-03-14

我遇到了一个语法问题。看另一个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) (...)'

有人能帮我解释一下我缺了什么知识吗?

共有1个答案

梁承恩
2023-03-14

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

(object_of_type_mem_func_pointer_points_to.*function_pointer)(parameters)
// or
(pointer_to_object_of_type_mem_func_pointer_points_to->function_pointer)(parameters)

不幸的是,(ScheduledTasks[i].*TaskFunction)()没有运行,因为TaskFunction应该指向控制器,而不是TaskProps。为了调用TaskFunction,您将需要一个Controller对象来调用该函数。这会给出类似于

(controller_object.*(scheduledTasks[i].taskFunction))()
// or
(pointer_to_controller_object->(scheduledTasks[i].taskFunction))()
 类似资料:
  • 我正在学习如何在C中使用并写了以下示例: 问:是否保证在所有情况下指向一个结构的指针都是指向它的第一个元素的完全相同的指针? 在这种特殊的情况下,它能像我预期的那样工作,但我不确定它是否能得到保证。编译器可以在开始时插入一些填充吗? 我唯一能找到的关于结构类型布局的是N1570的类型: 结构类型描述了一组按顺序分配的非空成员对象(在某些情况下,还包括一个不完整的数组),每个对象都有一个可选的指定名

  • 现在,我知道没有内联的保证,但是。。。 给定以下内容: 我们有: 编译成: 然而... 编译成: 这真的很让人难过。 为什么打给PMF的电话没有被内联?PMF是一个不变的表情!

  • 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType

  • 主要内容:关于数组指针的谜题数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以 为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个 指针,它指向数组的第 0 个元素。 在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:

  • 我正在学习链表,以及如何在C中使用结构和指针创建链表。下面我举一个例子。据我所知,被调用的将头节点所在的结构的开始内存位置作为参数传递。push()函数的参数将结构节点作为指向指针的指针,因此它作为引用传递,而不是实际副本。因此,我们的的第一个指针只是指向头部节点的内存位置的指针,第二个指针指向该值,该值是头部节点指向的下一个内存位置。我们通过为结构节点分配一些内存,在结构节点内创建一个名为new

  • FAQs in section [33]: [33.1] “成员函数指针”类型不同于“函数指针”吗? [33.2] 如何将一个成员函数指针传递到信号处理函数,X事件回调函数,系统调用来启动一个线程/任务等? [33.3] 为什么我总是收到编译错误(类型不匹配)当我尝试用一个成员函数作为中断服务例程? when I try to use a member function as an interru