2012-10-11 50 views
2

我有处理功能pointer.I已经由具有函数指针作为成员的类控制的一个问题:空函数指针,一个头文件内声明的功能

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 
+5

至少有三个不同的东西在你的榜样名为'mouseFunction'。检查以确保在您的实际代码,mouseFunction'的'每次使用是指你所期望的事情(考虑重新命名一些'mouseFunction's的,以避免通常由具有相同的多个因素引起的极度混乱名称在给定范围内可引用)。 –

回答

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; 
} 
0

您的问题可能是内联。由于函数声明在同一点定义,头..编译器,可以把它当作一个隐含的内联内(请注意,它是由编译器来决定是否要真正内联的话) 。如果内联函数,那么编译器将不得不通过一些额外的跳火圈,使其可以存储一个指针函数(即,编译器必须具有内置功能的非在线版本)。如果编译器没有做到这一点,那么在存储和调用函数指针时会遇到问题。

为了消除这是问题的一个可能来源,尝试移动功能的实现为CPP文件,这是为了防止隐性内联(通常是更好的风格是这样)一个常见的方式。