2014-06-15 5 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); 
     } 

그리고 - BLA '에 포인터 - 투 - 멤버 함수를 호출'>을 '어떤 이유로

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

    BLA=mainMachine.currentState; 

    BLA(input); 
} 

이 나던 작품은, "사용하거나해야한다 하더군요 (...) "하지만 내가 할 때라도 * BLA (입력); 작동하지 않습니다. 이것이 작동하지 않는 이유를 정말로 이해하지 못합니다.

+0

BLA는 인스턴스에 대한 포인터가 필요합니다. – 4pie0

+0

'mainMachine. * BLA'가 작동해야합니다. – Philipp

+0

그래, 그 덕분에 많이 일 했어, 지금은 분명해 보인다! – user3742604

답변

1

BLA는 멤버 함수 포인터를 직접 참조 해제 (함수 호출) 할 수 없으므로 인스턴스에 대한 포인터가 필요합니다. 그들은 어떤 객체 대신에 호출되어야하며, 그 다음에 멤버 함수가 사용할 "this"포인터를 제공한다. 함수가 어떤 객체를 조작하는지 알지 못하면 어떻게 객체 구현에 영향을주는 일을 할 수 있습니까?

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

example 예에서,

(mainMachine.*BLA)(input); 

또한 boost::function 또는 대신 원시 포인터의 std::function이 작업을 쉽게하기 위해 고려할 수 :

그래서 이것은 당신이 BLA에 할당 된 메소드를 호출 할 수있는 방법입니다

+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

관련 문제