문제

데이터 파일을 처리하고 문제가 발생할 때 오류를보고하는 코드가 있지만 클래스에 콜백 기능을 제공하는 방법을 해결하는 데 어려움이 있습니다. 다음은 내가 달성하려는 일의 빠른 예입니다.

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) );
    }
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top