为什么相应成员不能正确访问成员函数指针
Why are member function pointers not accessed properly by corresponding members?
考虑一下这个代码片段。
class B {
public:
void up() {
std::cout << "up" << std::endl;
}
void down() {
std::cout << "down" << std::endl;
}
void init( void(B::*someFunc)() , void(B::*otherFunc)() ) {
m_execute = someFunc;
B* newB = new B();
m_b = newB;
m_b->m_execute = otherFunc;
}
void find() {
(this->*m_execute)();
(m_b->*m_execute)();
}
private:
void(B::*m_execute)();
B* m_b;
};
int main(){
B* b = new B();
b->init(&B::up,&B::down);
b->find();
}
我有一个类B。它的私有成员是指向B的指针,即m_B和函数指针。在init((函数中,私有成员函数指针为up((,私有成员m_b的函数指针为down((当我运行代码时,B::up((被执行两次,而不是执行B::up((然后执行B:((。
m_execute
应用于另一个对象。
通过更改此行来解决此问题
(m_b->*m_execute)();
// ^^^^^^^^^
// Points to your m_execute, not m_b's
到此:
(m_b->*m_b->m_execute)();
更好的是,添加一个成员函数来运行您自己的execute,并从B::find
:调用它
void find() {
run_my_execute();
m_b->run_my_execute();
}
void run_my_execute() {
(this->*m_execute)();
}
这将避免混淆谁的指针应该应用于什么对象。
演示。
相关文章:
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间