2009-07-06 14 views
0

私はデータファイルを処理し、問題が発生したときにエラーを報告するコードをいくつか持っていますが、私のクラスにコールバック関数を与える方法を試していません。だから私は、私は誤使用している印象を受けますC++/CLIでレポートコールバックの関数を参照渡しにするにはどうすればよいですか?

1>CallbackTest.h(131) : error C3374: can't take address of 'CallbackFunctionTests::MyFileLoader::ErrorHandler' unless creating delegate instance 

か:

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); 
    } 
}; 

...問題があります。ここで私が達成しようとしているものの一種の簡単な例です物事を誤解している。おそらくこれを達成するより良い方法がありますか?あなたが関連するインスタンスを渡す必要があります - - あなたのケースでは、this - あなたが明示的にデリゲートを作成する必要が

答えて

4

それに:

m_mfh.SetErrorReporter(
    gcnew Reporter(this, &CallbackFunctionTests::MyFileLoader::ErrorHandler)); 
+0

+ 1:受け入れ中:優秀:-) –

0

誰もが興味を持っていた場合には、ここでは、最終的な(ワーキング)コードは次のとおりです。

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)); 
    } 
}; 
関連する問題