我在处理函数指针时遇到问题。我创建了一个具有函数指针作为成员的类Control:
void (*mouseFunction) (Control*, Event*);
该成员受到保护,并且具有setter和getter:
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);
如果我使用getter获取指针它是NULL;如果我尝试执行该函数,我会得到EXC_BAD_ACCESS:
error: address doesn't contain a section that points to a section in a object file
答案 0 :(得分:1)
以下鳕鱼正在运作,所以请确保您的方法是公开的,可以从除了对象之外的其他地方访问。
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;
}
答案 1 :(得分:0)
您的问题可能与内联有关。由于函数声明和在同一点和头部内部定义..编译器可能会将其视为隐式内联(请注意由编译器来决定是否实际内联它)。如果函数是内联的,则编译器必须跳过一些额外的箍以使得可以存储指向该函数的指针(即,编译器必须具有内置的函数的非内联版本)。如果编译器没有实现这一点,那么你将在存储和调用函数指针方面遇到问题。
要将此作为问题的可能来源消除,请尝试将函数的实现移到cpp文件中,这是防止隐式内联的一种常用方法(通常还有更好的样式)。