2009-07-06 47 views
0

我有一些處理數據文件的代碼,當它遇到問題時報告錯誤,但是我在處理如何給我的類一個回調函數時遇到了問題。下面是這類事情的一個簡單的例子,我想實現:如何通過引用爲C++/CLI中的報告回調傳遞函數?

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 

所以我得到我誤用或印象誤解事物。也許有更好的方法來實現這一目標?

回答

4

你需要明確建立委託 - 你需要通過相關的實例 - 在你的情況,this - 它:

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

+ 1 /接受:優秀 - 明白了:-) – 2009-07-06 10:54:14

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)); 
    } 
}; 
相關問題