2014-06-15 71 views
0

这可能会被延迟,并且我已经搜索并尝试了很多解决方案,但是我总是遇到错误。无法通过函数指针执行类函数C++

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(输入);它不起作用。 我真的不明白为什么这不起作用。

+0

BLA需要一个指向实例的指针 – 4pie0

+0

'mainMachine。* BLA'应该可以工作。 – Philipp

+0

是的,这工作非常感谢,现在看起来很明显! – user3742604

回答

1

BLA需要一个指向实例的指针,因为成员函数指针无法直接由它们自己解除引用(调用它们的函数)。它们必须代表某个对象被调用,然后提供“this”指针供成员函数使用。如果函数不知道它在哪个对象上运行,你还可以做什么来影响对象的实现。

因此,这是你可以调用分配给BLA的方法:

(mainMachine.*BLA)(input); 

你也可以考虑boost::functionstd::function,而不是原始指针,以缓解操作,例如:

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

example

+0

感谢您的彻底解答! – user3742604

+0

我为您服务先生。 – 4pie0

0

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

(mainMachine.*BLA)(input); 

作为一个指针指向一个成员函数,所有BLA包含一个成员函数的地址,没有任何物体与它的使用。

+0

谢谢,这确实有效。是的,其他问题并不是真的在原来的程序中,我拿走了相关部分并忘记了这些东西。谢谢! – user3742604

+0

@ user3742604,在未来的问题中提供[MCVE](http://stackoverflow.com/help/mcve)是明智的。人们可以采取的措施,粘贴到编辑器中,编译并可能修复。 – ghostofstandardspast

+0

我不明白BLA =&mainStateMachine :: currentState;将会工作,因为BLA应该等于mainMachine对象的.currentState。这相当于什么? – user3742604