Я искал ответы на эту проблему в течение последнего часа, но не могу найти решение, которое работает. Я пытаюсь использовать указатели на функции для вызова нестатической функции-члена определенного объекта. Мой код компилируется нормально, но во время выполнения я получаю неприятное исключение во время выполнения, в котором говорится:
Ошибка проверки времени выполнения № 0 - значение ESP не было должным образом сохранено при вызове функции. Обычно это результат вызова функции, объявленной с одним соглашением о вызовах, с указателем функции, объявленным с другим соглашением о вызовах.
На многих веб-сайтах говорится, что соглашение о вызовах указывается в заголовке метода, поэтому я добавил __cdecl
перед ним. Однако мой код обнаружил то же исключение времени выполнения после изменения (я также пробовал использовать другие соглашения о вызовах). Я не уверен, почему я должен указывать cdecl в первую очередь, потому что в настройках моего проекта задано cdecl. Я использую некоторые внешние библиотеки, но они работали нормально до того, как я добавил этот указатель на функцию.
Я слежу за этим: https://stackoverflow.com/a/151449
Мой код:
А.ч
#pragma once
class B;
typedef void (B::*ReceiverFunction)();
class A
{
public:
A();
~A();
void addEventListener(ReceiverFunction receiverFunction);
};
A.cpp
#include "A.h"
A::A(){}
A::~A(){}
void A::addEventListener(ReceiverFunction receiverFunction)
{
//Do nothing
}
B.h
#pragma once
#include <iostream>
#include "A.h"
class B
{
public:
B();
~B();
void testFunction();
void setA(A* a);
void addEvent();
private:
A* a;
};
B.cpp
#include "B.h"
B::B(){}
B::~B(){}
void B::setA(A* a)
{
this->a = a;
}
void B::addEvent()
{
a->addEventListener(&B::testFunction); //This is the offending line for the runtime exception
}
void B::testFunction()
{
//Nothing here
}
main.cpp
#include "A.h"
#include "B.h"
int main()
{
A* a = new A();
B* b = new B();
b->setA(a);
b->addEvent();
}
Я работаю с Visual Studio 2010, но мне бы хотелось, чтобы мой код работал на других платформах с минимальными изменениями.
this
) при вызове нестатического метода - person LeleDumbo   schedule 30.12.2011receiverFunction
. Лучше всего предоставить небольшой фрагмент, который демонстрирует проблему и является полным, т. Е. Может быть скопирован для тестирования. - person Xeo   schedule 30.12.2011