【问题标题】:Can't execute a class function through a function pointer c++无法通过函数指针c ++执行类函数
【发布时间】:2014-06-15 16:33:10
【问题描述】:

这可能是迟钝的,我已经搜索并尝试了很多解决方案,但总是出错。

class mainStateMachine;
typedef void (mainStateMachine::*StateProc)( EIndication input); 

class mainStateMachine
    {    
        public:
            StateProc currentState;
            int transition;
            void rotateUntilBlobsFound    ( EIndication input); 
          void clarifyImage             (EIndication input); 
        }

然后:

main()
{
    int input=0;
    StateProc BLA;
    mainStateMachine mainMachine;
    mainMachine.currentState=&mainStateMachine::rotateUntilBlobsFound; 

    BLA=mainMachine.currentState;

    BLA(input);
}

由于某种原因这不起作用,告诉我“必须使用 '.' 或 '->' 来调用 'BLA (...) 中的指向成员函数的指针”但即使在我做 *BLA(输入);它不起作用。 我真的不明白为什么这不起作用。

【问题讨论】:

  • BLA 需要一个指向实例的指针
  • mainMachine.*BLA 应该可以工作。
  • 是的,非常感谢,现在看起来很明显了!

标签: c++ function class pointers


【解决方案1】:

BLA 需要一个指向实例的指针,因为成员函数指针本身不能直接取消引用(调用它们的函数)。必须代表某个对象调用它们,然后提供“this”指针供成员函数使用。如果函数不知道它在哪个对象上运行,你还能如何做影响对象实现的事情。

这就是你如何调用分配给 BLA 的方法:

(mainMachine.*BLA)( input);

您还可以考虑使用boost::function 或std::function 代替原始指针来简化操作,例如:

std::function< void(const mainStateMachine&, EIndication)> f_ptr = 
                                           &mainMachine::rotateUntilBlobsFound;
    const mainStateMachine foo;
    f_ptr( foo, EIndication());

example

【讨论】:

  • 感谢您的详尽回答!
  • 先生,我随时为您服务。
【解决方案2】:

除了其他错误,例如类定义后没有分号和main 没有返回类型,指向成员的指针需要一个对象来操作。您可以使用指向成员运算符的指针来提供一个:

(mainMachine.*BLA)(input);

作为指向成员函数的指针,BLA 包含的所有内容都是成员函数的地址,而不是与它一起使用的任何对象。

【讨论】:

  • 谢谢,确实有效。是的,其他问题并不真正存在于原始程序中,我拿走了相关部分并忘记了那些东西。谢谢!
  • @user3742604,您最好在以后的问题中提供MCVE。人们可以获取、粘贴到编辑器、编译和可能修复的东西。
  • 我不明白 BLA= &mainStateMachine::currentState;不过会起作用,因为 BLA 应该等于 mainMachine 对象的 .currentState 。怎么样?
  • @ghostofstandardspast BLA = &mainStateMachine::currentState;不正确,因为 currentState 已经是一个指针
  • @bits_international,对不起,我认为它是一个成员函数。我会改变的。
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多