首页 > 解决方案 > c ++迭代成员函数

问题描述

我有一点设计问题:

我有一个描述机器人的类;它可以移动到不同的方向,将相机移动到不同的视图等。它看起来像这样:

class Robot {
    private:
        ...

    public:
        void move_right();
        void move_left();
        void switch_camera()
        void raise_camera()
}

我想添加另一种执行一系列事件的方法。问题是,我需要能够中途中止事件。

我确实想澄清一下,机器人是在微控制器上运行,而不是在标准操作系统上运行——所以我不能真正向进程或任何东西发送信号。

我的第一个想法是将事件函数存储在一个数组中并对其进行迭代:

#typedef void(robo_event *)(void)

robo_event next_event;
robo_event *event_sequence;

Robot() {
    this->next_event = nullptr;

}


void perform_event_series() {
    for(this->next_event = *event_sequence; this->next_event != nullptr; this->next_event+=sizeof(robo_event)) {
        this->next_event();
    }
}

void abort_event_series() {
    this->next_event = nullptr;
}

问题是,c++ 标准禁止存储成员函数的地址,所以这开始变得尴尬。我可以将函数设为静态,但我确实需要经常使用它们,这仍然很尴尬。如果更改尚未到来,我希望能够在不做太多工作的情况下更改为事件序列,所以我认为将它们保存在某种数组/向量上是最好的。

任何有关 c++ 成员函数语法的帮助/有关如何解决此问题的更好想法将不胜感激。

标签: c++pointersmicrocontroller

解决方案


问题是,c++ 标准禁止存储成员函数的地址

C++ 最肯定允许您存储指向成员函数(和变量)的指针,但语法有点不同,以适应this指针类型、virtual函数、继承等。

class Example
{
public:
    double foo(int x) { return x * 1.5; }
};
int main() {
    double (Example::* member_function_ptr)(int);
    member_function_ptr = &Example::foo;

    Example example;
    std::cout << (example.*member_function_ptr)(2) << std::endl;
}

如果你所有的函数都用于同一个类、相同的返回类型、相同的参数等,那么你可以很容易地制作一张它们的表格。


推荐阅读