C++ 空函数指针,在头文件中声明的函数

C++ 空函数指针,在头文件中声明的函数,c++,xcode,osx-lion,C++,Xcode,Osx Lion,我在处理函数指针时遇到问题。我制作了一个类控件,该控件的成员为函数指针: void (*mouseFunction) (Control*, Event*); 该成员受保护,并且具有setter和getter: void (*getMouseFunction()) (Control*,Event*) { return mouseFunction; } void setMouseFunction( void (*mouseFunction) (Control*, Event*) ) {

我在处理函数指针时遇到问题。我制作了一个类控件,该控件的成员为函数指针:

void (*mouseFunction) (Control*, Event*);
该成员受保护,并且具有setter和getter:

void (*getMouseFunction()) (Control*,Event*)
{
    return mouseFunction;
}
void setMouseFunction( void (*mouseFunction) (Control*, Event*) )
{
    this->mouseFunction=mouseFunction;
}
问题是,即使设置了指针,指针也始终为空。
我在头文件中声明了一个函数:

void mouseFunction (Control* control, Event* event)
{
    std::cout << "Inside Text Field";
}
如果我使用getter来获取指针,它是空的;如果我尝试执行该函数,我会获得EXC\u BAD\u访问权限:

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文件中,这是防止隐式内联的一种常见方法(通常是更好的样式)。

在您的示例中,至少有三种不同的名称命名为
mouseFunction
。检查以确保在您的实际代码中,每次使用<代码>鼠标功能> /代码>是指您所期望的事情(并且考虑重新命名一些<代码>鼠标函数< /Cult> s,以避免由于在给定范围内引用相同名称的多个事物而引起的极度混乱)。
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;
}