c++ - 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++ 标准禁止存储成员函数的地址
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;
}
如果你所有的函数都用于同一个类、相同的返回类型、相同的参数等,那么你可以很容易地制作一张它们的表格。