문제

어떻게 할 수 있습니까? (다음 코드는 작동하지 않지만 아이디어를 설명하기를 바랍니다.)

class MyClass  
{  
    ....  
 private:
    int ToBeCalled(int a, char* b);

    typedef (MyClass::*FuncSig)(int a, char* b);

    int Caller(FuncSig *func, char* some_string);
}

어떤 식 으로든 발신자에게 전화하고 싶습니다.

Caller(ToBeCalled, "stuff")

그리고 가지고 있습니다 Caller 전화 ToBeCalled 어떤 매개 변수를 사용하면 통과가 필요하다고 느낍니다. 가능하다면 모든 것을 수업의 개인 부분에 캡슐화하고 싶습니다. 실제로, 나는 약 50 개의 기능을 가지고 있습니다 ToBeCalled, 그래서 나는 이것을 피할 수있는 방법을 볼 수 없습니다.

제안 해주셔서 감사합니다. :)

도움이 되었습니까?

해결책

당신은 그곳에서 대부분의 길입니다. typedef에서 반환 유형이 누락되었습니다.

typedef int (MyClass::*FuncSig)(int, char*);

이제 올바르게 사용하면됩니다.

int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}

당신은 평원을 지나가고 싶어합니다 FuncSig 인스턴스가 아닙니다 FuncSig* -- ㅏ FuncSig* 불필요한 수준의 간접 수준을 가진 멤버 함수에 대한 포인터에 대한 포인터입니다. 그런 다음 Arrow-Star 연산자 (공식 이름이 아님)를 사용하여 다음을 호출합니다.

(object_to_be_called_on ->* func)(args);

비 포인터 객체 (예 : 스택의 객체 또는 객체에 대한 참조)의 경우 닷-스타 연산자를 사용합니다.

MyClass x;
(x .* func)(args);

또한 연산자 우선 순위에주의하십시오. 화살표 별 및 도트 스타 연산자는 기능 호출보다 우선 순위가 낮으므로 위에서했던 것처럼 여분의 괄호 안에 넣어야합니다.

다른 팁

나는 당신이 시도했다고 가정합니다 Caller(MyClass::ToBeCalled, "stuff") 이미,하지만 기능 포인터가 필요한 특별한 이유가 있습니까? 또한 실제 컴파일러 오류를 게시하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top