我有一个设计问题:
我有一个描述机器人的课程;它可以向不同的方向移动,也可以将相机移动到不同的视图等。
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 ++成员函数语法的帮助/关于如何解决此问题的更好的主意,将不胜感激。
答案 0 :(得分:2)
Thing is, the c++ standard forbids storing addresses of member functions
C++ most certainly allows you to store pointers to member functions (and variables), but the syntax is a bit different to accommodate the this
pointer type, virtual
functions, inheritance, etc.
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;
}
If all your functions are for the same class, same return type, same arguments, etc. then you can make a table of them easy enough.
答案 1 :(得分:1)
函数指针的类型与成员指针的类型不同。
您需要void(Robot::*)(void)
而不是void(*)(void)
。
class Robot {
private:
typedef void(Robot::*robot_event)(void)
robo_event next_event;
robo_event *event_sequence;
Robot() {
next_event = nullptr;
}
void perform_event_series() {
for(next_event = *event_sequence; next_event != nullptr; ++next_event) {
(this->*next_event)();
}
}
void abort_event_series() {
next_event = nullptr;
}
public:
void move_right();
void move_left();
void switch_camera()
void raise_camera()
}
答案 2 :(得分:1)
在c ++中完全允许存储指向成员函数的指针:
public sealed class Singleton
{
private static WeakReference<Singleton> weakInstance;
public WeakReference<Singleton> Instance
{
get
{
if (weakInstance == null)
weakInstance = new WeakReference<Singleton>(this);
else
weakInstance.SetTarget(this);
return weakInstance;
}
}
}