NULL函数指针,在头文件中声明的函数

时间:2012-10-11 18:43:25

标签: c++ xcode osx-lion

我在处理函数指针时遇到问题。我创建了一个具有函数指针作为成员的类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

2 个答案:

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