C++에서 클래스 내 멤버 함수를 콜백 함수로 넘기고 싶을땐 어떻게 하는게 좋나요?
글쓴이: greathero / 작성시간: 수, 2013/03/27 - 11:32오후
class A { public: void printStatus(); void msgPrint(string msg); void testCallback(); }; class B { public: void foo(void (*callback1)(), void (*callback2)(string)); ... }; void A::testCallback() { B *b; b->foo(&A::printStatus, &A::msgPrint); // 이렇게 두개의 함수를 콜백으로 넘기고 싶은데 안됩니다. }
A의 printStatus 함수와 msgPrint 함수를 b의 foo 함수에 콜백으로 넘기고 싶습니다.
어떻게 해야하나요?
Forums:
자료형이 다르니까요.
void foo(void (A::*callback1)(), void (A::*callback2)(string))
라고 해야 할 듯
그렇게 해봤었는데요...
foo 함수안에서 콜백 호출은 어떻게 해야되는걸까요?;;
그리고 저렇게 함수 시그니처를 scope operator를 써서 한정짓는 방법은 별로 좋지 않아보여서ㅠ
static 으로 선언하는게 맞아보입니다.
void printStatus();
void msgPrint(string msg);
를 static 으로 쓰시는건 어떠신지요.
static type으로 callback은 가능합니다.
Dig it.
음...
그렇게 와닿지는 않는 방법이네요ㅠ
일반적인 함수도 콜백함수로 받고 멤버함수도 콜백으로
일반적인 함수도 콜백함수로 받고 멤버함수도 콜백으로 받고 싶으시거든 그냥 C++11에 추가된 std::function을 쓰시는 게 편합니다.
소스 잘 봤습니다~
덕분에 잘 적용했구요~ㅎ
궁금한게 콜백을 register하는 함수의 인자(foo의 인자)를 rvalue로 정한건 rvalue-reference를 통한 "완벽한 전달"을 위해서였나요?
네 맞습니다. 그런데 다시 보니 perfect
네 맞습니다. 그런데 다시 보니 perfect forwarding이 필요가 없었네요. 다음과 같이 move semantic을 활용하시는 것이 가독성을 위해 좋을 것으로 보입니다.
살다보니 저도 답변이란 걸 해보네요. @_@
안녕하세요.
KLDP 5년만에 답변이란 걸... ㅋㅋ
아래와 같이 코드를 짜 보았습니다.
원하는 답변이 될지 모르겠네요.
참고로, foo 함수에 class A 의 객체를 넘겨주는 포인터를 추가하였습니다.
^^
많이 배우네요
감사드립니다
C++을 컴파일한 후의 결과물을 보게 되면 메소드들은
C++을 컴파일한 후의 결과물을 보게 되면 메소드들은 고정된 위치에 있는 하나의 "함수"가 되고, 인수 목록에 현재 조작중인 인스턴스에 대한 포인터가 인수 목록에 추가됩니다. 물론 이 인수는 C++ 코드상에는 없는, 컴파일러가 알아서 추가하는 인수입니다.
이때문에 static이 아닌 메소드의 포인터를 콜백함수로 넘겨서 외부에서 호출하면 이 숨겨진 인수 때문에 뭔 일이 터질지 모릅니다.
static method이면 "클래스 내의 유일"이 되므로 일반 메소드처럼 컴파일러가 인스턴스 포인터를 추가할 필요가 없습니다. (특정 인스턴스를 조작해야 한다면 사용자가 직접 인수로 추가해줘야 함)
다만 static method가 함수보다 나은 점이라면 클래스 내에 소속되어 있기 때문에 컴파일러가 더 강하게 에러체크할 수 있습니다. 프로그램 만들 때 그만큼 사람의 실수를 더 줄일수 있는거죠.
Written By the Black Knight of Destruction
댓글 달기