>백엔드 개발 >C++ >C에서 클래스 멤버 함수를 콜백으로 올바르게 전달하는 방법은 무엇입니까?

C에서 클래스 멤버 함수를 콜백으로 올바르게 전달하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-16 13:26:21538검색

How to Correctly Pass Class Member Functions as Callbacks in C  ?

클래스 멤버 함수를 콜백으로 전달할 때 컴파일 오류 극복

오해로 인해 클래스 멤버 함수를 콜백으로 전달할 때 컴파일 오류가 발생합니다. 멤버의 구문 및 숨겨진 "this" 매개변수에 대해

멤버 함수 명확화

멤버 함수는 독립형 함수가 아니라 추가 숨겨진 "this" 포인터가 있는 함수입니다. 이 포인터는 함수가 속한 클래스의 인스턴스를 참조합니다. 클래스 인스턴스 구문(예: object.memberFunction())을 사용하여 멤버 함수를 호출하면 컴파일러는 "this"의 값을 자동으로 결정합니다.

구문 수수께끼

&CLoggersInfra::RedundencyManagerCallBack을 콜백으로 전달하려고 시도했기 때문에 초기 접근 방식이 실패했습니다. 이 함수 포인터에는 필요한 "this" 포인터가 없습니다. 올바른 구문은 다음과 같습니다.

m_cRedundencyManager->Init(std::bind(&CLoggersInfra::RedundencyManagerCallBack, this));

숨겨진 "this" 공개

CLoggersInfra 클래스의 특정 인스턴스와 관련된 콜백을 전달하려고 합니다. 숨겨진 "this" 포인터를 설명하려면 이를 명시적으로 바인딩해야 합니다.

std::bind1st 및 Boost::bind Rescue

std::bind1st 사용 또는 Boost::bind를 사용하여 "this" 포인터를 바인딩하여 인스턴스를 숨겨진 매개변수로 사용하고 평소와 같이 콜백의 원래 매개변수를 사용하는 새 함수를 만듭니다. 이렇게 하면 컴파일 문제가 해결됩니다.

The Hidden Catch

Init에는 Boost::bind가 기본적으로 제공하지 않는 원시 함수 포인터가 필요합니다. 그러나 StackOverflow는 Boost::functions를 원시 포인터로 변환하는 솔루션을 제공합니다.

Lambda 함수를 사용한 C 11 업데이트

C 11 이상에서는 캡처하는 람다 함수 "this"는 이러한 목적으로 Boost::bind를 대체할 수 있습니다.

위 내용은 C에서 클래스 멤버 함수를 콜백으로 올바르게 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.