どのように私は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