2

関数ポインタの処理に問題があります。関数ポインタをメンバーとして持つクラスControlを作成しました。

void (*mouseFunction) (Control*, Event*);

メンバーは保護されており、セッターとゲッターがあります。

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);

ゲッターを使用してポインターを取得すると、NULLになります。関数を実行しようとすると、EXC_BAD_ACCESSが取得されます。

error: address doesn't contain a section that points to a section in a object file
4

2 に答える 2

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

問題はインライン展開にある可能性があります。関数は同じポイントでヘッダー内で宣言および定義されるため、コンパイラーはそれを暗黙のインラインとして処理する可能性があります (実際にインライン化するかどうかを決定するのはコンパイラー次第であることに注意してください)。関数がインライン化されている場合、コンパイラは、その関数へのポインタを格納できるようにするために、いくつかの追加のフープをジャンプする必要があります (つまり、コンパイラは、関数の非インライン バージョンを構築する必要があります)。コンパイラがこれを行わない場合、関数への関数ポインタの保存と呼び出しに問題が発生します。

これを問題の原因として排除するには、関数の実装を cpp ファイルに移動してみてください。これは、暗黙のインライン化を防ぐ一般的な方法の 1 つです (通常はより良いスタイルになります)。

于 2012-10-11T19:07:41.073 に答える