无法通过函数指针c ++执行类函数

时间:2014-06-15 16:33:10

标签: c++ function class pointers

这可能会被延迟,我已经搜索并尝试了很多解决方案,但我总是会遇到错误。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

(mainMachine.*BLA)(input);

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