У меня проблема с обработкой указателя на функцию. Я создал класс Control, который имеет указатель на функцию в качестве члена:
void (*mouseFunction) (Control*, Event*);
Член защищен, и у него есть сеттер и геттер:
void (*getMouseFunction()) (Control*,Event*)
{
return mouseFunction;
}
void setMouseFunction( void (*mouseFunction) (Control*, Event*) )
{
this->mouseFunction=mouseFunction;
}
Проблема в том, что даже после установки указателя он всегда равен NULL.
У меня есть функция, объявленная внутри заголовочного файла:
void mouseFunction (Control* control, Event* event)
{
std::cout << "Inside Text Field";
}
Если я попытаюсь назначить это:
myControlInstance.setMouseFunction(mouseFunction);
Если я использую метод получения, чтобы получить указатель, это NULL; и если я пытаюсь выполнить функцию, я получаю EXC_BAD_ACCESS:
error: address doesn't contain a section that points to a section in a object file
Работает следующий код, поэтому убедитесь, что ваш метод общедоступен, чтобы быть доступным из другого места, чем объект.
typedef int Event;
class Control
{
public:
void (*mouseFunction) (Control*, Event*);
void (*getMouseFunction()) (Control*,Event*)
{
return mouseFunction;
}
void setMouseFunction( void (*mouseFunction) (Control*, Event*) )
{
this->mouseFunction=mouseFunction;
}
};void mouseFunction (Control* control, Event* event)
{
printf ("test");
}int _tmain(int argc, _TCHAR* argv[])
{
Control c;
c.setMouseFunction(mouseFunction);
Event e = 1;
c.mouseFunction(&c,&e);
return 0;
}
Ваша проблема может быть с врезкой. Поскольку функция объявлена а также определяется в той же точке и внутри заголовка … компилятор может рассматривать его как неявный встроенный (обратите внимание, что именно компилятор должен решить, действительно ли он встроен в него). Если функция встроенная, то компилятору придется перепрыгивать через несколько дополнительных циклов, чтобы можно было сохранить указатель на эту функцию (т. Е. Компилятор должен иметь не встроенную версию встроенной функции). Если компилятор этого не сделает, у вас возникнут проблемы с хранением и вызовом указателя на функцию.
Чтобы устранить это как возможный источник проблемы, попробуйте переместить реализацию функции в файл cpp, который является одним из распространенных способов предотвращения неявного встраивания (и, как правило, в любом случае, лучшего стиля).