C ++, делегаты, сбой приложения, неизвестная причина - PullRequest
1 голос
/ 22 марта 2012

У меня странная проблема с моим кодом, так как компилятор генерирует код, который приводит к сбою моего тестируемого приложения.Я использую компилятор Visual C ++ 2010.Код:

template < typename TDstType,
           typename TSrcType >
TDstType unsafe_cast( TSrcType anySrc )
{
    return ( TDstType ) anySrc;
}

template < typename TDstType,
           typename TSrcType >
TDstType brutal_cast( TSrcType anySrc )
{
    return *( TDstType* ) &anySrc;
}

template < typename TParamType >
class EventHandler
{

public:

    template < typename TObjectType >
    EventHandler( TObjectType&  refObject, 
           void ( TObjectType::*pfnMethod )( TParamType ) );

    void operator()( TParamType anyParam );

private:

    void* m_ptrMethod;
    void* m_ptrObject;

};

template < typename TParamType  >
template < typename TObjectType >
inline EventHandler< TParamType >::EventHandler( TObjectType& refObject, void ( TObjectType::*pfnMethod )( TParamType ) )
: m_ptrMethod( brutal_cast< void* >( pfnMethod ) ),
  m_ptrObject( &refObject )
{
}

template < typename TParamType >
inline void EventHandler< TParamType >::operator()( TParamType anyParam )
{
                    class Class;
    ( unsafe_cast<        Class  *                 >( m_ptrObject )->*
      brutal_cast< void ( Class::* )( TParamType ) >( m_ptrMethod ) )( anyParam );
}

И код приложения тестирования:

class SomeClass
{

public:

    void Method( int intParam )
    {
        printf( "%d\n", intParam );
    }

};

int main( int intArgc, char* arrArgv[] )
{
    EventHandler< int > varEventHandler( *new SomeClass(), &SomeClass::Method );

    varEventHandler( 10 );

    return 0;
}

Скомпилированное приложение аварийно завершает работу при попытке чтения из недопустимого места в памяти.Я проверил в отладчике Visual Studio каждую переменную, идущую, но ни одна не содержит неверный адрес.Я надеюсь, что любой может помочь мне исправить это, поскольку я потерпел неудачу.Может быть, причина в передозировке кофе ...

1 Ответ

2 голосов
/ 22 марта 2012

Это не может работать;Вы не можете привести указатель на член к void *.Это приводит к потере информации, и программа, что неудивительно, падает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...