같은 클래스의 개인 회원에 대한 포인터를 취하는 개인 회원 기능
-
19-09-2019 - |
문제
어떻게 할 수 있습니까? (다음 코드는 작동하지 않지만 아이디어를 설명하기를 바랍니다.)
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")
이미,하지만 기능 포인터가 필요한 특별한 이유가 있습니까? 또한 실제 컴파일러 오류를 게시하십시오.