C ++/CLI의 보고서 콜백에 대한 참조로 함수를 어떻게 전달할 수 있습니까?
-
23-08-2019 - |
문제
데이터 파일을 처리하고 문제가 발생할 때 오류를보고하는 코드가 있지만 클래스에 콜백 기능을 제공하는 방법을 해결하는 데 어려움이 있습니다. 다음은 내가 달성하려는 일의 빠른 예입니다.
public delegate void Reporter( System::String^ stringToReport );
/// <summary>
/// Simple file handler with callback options on error
/// </summary>
public ref class MyFileHandler
{
private:
Reporter^ m_reporter;
void ReportError(String^ error)
{
if( m_reporter )
{
m_reporter( error );
}
}
public:
MyFileHandler()
{
}
void SetErrorReporter( Reporter^ reporter )
{
m_reporter = reporter;
}
bool FailingOperation()
{
return false;
}
bool GetData()
{
bool succeeded = false;
// Do some operation that fails
succeeded = FailingOperation();
if( succeeded == false )
{
ReportError( "Gah, something bad happened!" );
}
}
};
public ref class MyFileLoader
{
private:
MyFileHandler m_mfh;
void ErrorHandler(String^ errorMsg)
{
System::Windows::Forms::MessageBox::Show( errorMsg );
}
public:
MyFileLoader()
{
m_mfh.SetErrorReporter( &CallbackFunctionTests::MyFileLoader::ErrorHandler );
}
};
... 문제가 있습니다.
1>CallbackTest.h(131) : error C3374: can't take address of 'CallbackFunctionTests::MyFileLoader::ErrorHandler' unless creating delegate instance
그래서 나는 내가 잘못 사용하거나 오해하는 인상을 얻습니다. 어쩌면 이것을 달성하는 더 좋은 방법이 있습니까?
해결책
대의원을 명시 적으로 만들어야하며, 귀하의 경우 관련 인스턴스를 통과해야합니다. this
- 그것에 :
m_mfh.SetErrorReporter(
gcnew Reporter(this, &CallbackFunctionTests::MyFileLoader::ErrorHandler));
다른 팁
누구나 관심이있는 경우 최종 (작업) 코드는 다음과 같습니다.
public delegate void Reporter( System::String^ stringToReport );
/// <summary>
/// Simple file handler with callback options on error
/// </summary>
public ref class MyFileHandler
{
private:
Reporter^ m_reporter;
void ReportError(String^ error)
{
if( m_reporter )
{
m_reporter( error );
}
}
public:
MyFileHandler()
{
}
void SetErrorReporter( Reporter^ reporter )
{
m_reporter = reporter;
}
bool FailingOperation()
{
return false;
}
bool GetData()
{
bool succeeded = false;
// Do some operation that fails
succeeded = FailingOperation();
if( succeeded == false )
{
ReportError( "Gah, something bad happened!" );
}
return succeeded;
}
};
public ref class MyFileLoader
{
private:
MyFileHandler m_mfh;
void ErrorHandler(String^ errorMsg)
{
System::Windows::Forms::MessageBox::Show( errorMsg );
}
public:
MyFileLoader()
{
m_mfh.SetErrorReporter( gcnew Reporter(this, &CallbackFunctionTests::MyFileLoader::ErrorHandler) );
}
};
제휴하지 않습니다 StackOverflow