2

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

2 回答 2

1

以下 cod 正在工作,因此请确保您的方法是公开的,以便可以从对象以外的其他地方访问。

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;
}
于 2012-10-11T19:01:43.183 回答
0

您的问题可能与内联有关。由于该函数是在同一点声明定义的,并且在标头内..编译器可能会将其视为隐式内联(请注意,由编译器决定是否实际内联它)。如果函数是内联的,那么编译器将不得不跳过一些额外的环节来存储指向该函数的指针(即,编译器必须构建函数的非内联版本)。如果编译器没有实现这一点,那么您将在存储和调用指向该函数的函数指针时遇到问题。

要消除此问题的可能根源,请尝试将函数的实现移出到 cpp 文件中,这是防止隐式内联的一种常用方法(并且通常是更好的样式)。

于 2012-10-11T19:07:41.073 回答