【问题标题】:NULL function pointer, function declared inside a header fileNULL 函数指针,在头文件中声明的函数
【发布时间】:2012-10-11 18:43:25
【问题描述】:

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

【问题讨论】:

  • 在您的示例中,至少有三个不同的事物名为 mouseFunction。检查以确保在您的真实代码中,mouseFunction 的每次使用都指的是您期望的东西(并考虑重命名一些 mouseFunctions,以避免通常由多个相同的东西引起的极端混乱在给定范围内可引用的名称)。

标签: c++ xcode osx-lion


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 2012-03-08
      • 2018-11-11
      • 1970-01-01
      相关资源
      最近更新 更多