c++ - 在类声明中处理指向成员函数的指针
问题描述
我试图让一个成员函数即时将自己重定向到其他成员函数。这是我要实现的一些简化的伪代码:
class Foo
{
public:
Foo();
int counter = 0;
void slaveA() { counter++; };
void slaveB() { counter--; };
void (*master)() = &slaveA;
void toggleSlave()
{
_useB = !_useB;
if (_useB)
master = &slaveB;
else
master = &slaveA;
}
private:
boolean _useB = false;
};
Foo foo;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (random(2) == 0)
foo.toggleSlave();
foo.master();
Serial.println(foo.counter);
delay(500);
}
但是,无论我做什么,我都会遇到这些错误:
cannot convert 'void (Foo::*)()' to 'void (*)()' in initialization
cannot convert 'void (Foo::*)()' to 'void (*)()' in assignment
在我的主要项目中,master
将在硬件允许的情况下以至少 5 个从站的速度尽可能快地调用 ,这就是为什么我尝试在函数指针之间切换而不是在内部放置 if-else 的原因master
。
我读过一堆说静态函数将是首选方法的东西,但我需要从属方法能够操纵成员变量,理想情况下我希望所有内容都包含在类声明中,因此从技术上讲对象引用是所有相关的成员功能都可以随时使用。
这样的事情可能吗?
解决方案
由于从属是非静态成员函数,master
因此需要是指向成员函数的指针,而不是指向函数的指针。代码如下所示:
class Foo
{
public:
Foo();
int counter = 0;
void slaveA() { counter++; };
void slaveB() { counter--; };
void (Foo::*master)() = &Foo::slaveA;
void toggleSlave()
{
_useB = !_useB;
if (_useB)
master = &Foo::slaveB;
else
master = &Foo::slaveA;
}
private:
bool _useB = false;
};
void loop()
{
if (random(2) == 0)
foo.toggleSlave();
(foo.*foo.master)();
Serial.println(foo.counter);
delay(500);
}
由于语法(foo.*foo.master)()
相当难看,我建议在其中创建master
一个函数foo
并将成员指针作为其实现细节:
class Foo
{
public:
Foo();
int counter = 0;
void slaveA() { counter++; };
void slaveB() { counter--; };
void master() {
(this->*_master)();
}
void toggleSlave()
{
_useB = !_useB;
if (_useB)
_master = &Foo::slaveB;
else
_master = &Foo::slaveA;
}
private:
void (Foo::*_master)() = &Foo::slaveA;
bool _useB = false;
};
void loop()
{
if (random(2) == 0)
foo.toggleSlave();
foo.master();
Serial.println(foo.counter);
delay(500);
}
推荐阅读
- javascript - 模式以允许 2 个字母数字之间的可选连字符并限制空格
- ruby - XLS 抛出 java.lang.ClassNotFoundException:org.apache.poi.hssf.util.HSSFColor$BLACK
- sql - 根据逗号分隔的字符串列将一行拆分为多行
- javascript - 在 Maven 中编写脚本以设置项目属性
- r - 使用百分位数和相应值在 R 中绘制分布
- sql - SQL在使用pivot后添加多个计算行
- java - 格式化输出到文件
- java - 使用 swagger-code-gen-cli jar 生成 pojo 类时,扩展类中的字段丢失
- php - 无法使用 Imagemagick 读取 pdf 文件
- botframework - 如何在 PromptAttribute 文本中添加换行符?