2012-10-11 45 views
2

我有處理功能pointer.I已經由具有函數指針作爲成員的類控制的一個問題:空函數指針,一個頭文件內聲明的功能

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 
+5

至少有三個不同的東西在你的榜樣名爲'mouseFunction'。檢查以確保在您的實際代碼,mouseFunction'的'每次使用是指你所期望的事情(考慮重新命名一些'mouseFunction's的,以避免通常由具有相同的多個因素引起的極度混亂名稱在給定範圍內可引用)。 –

回答

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; 
} 
0

您的問題可能是內聯。由於函數聲明在同一點定義,頭..編譯器,可以把它當作一個隱含的內聯內(請注意,它是由編譯器來決定是否要真正內聯的話) 。如果內聯函數,那麼編譯器將不得不通過一些額外的跳火圈,使其可以存儲一個指針函數(即,編譯器必須具有內置功能的非在線版本)。如果編譯器沒有做到這一點,那麼在存儲和調用函數指針時會遇到問題。

爲了消除這是問題的一個可能來源,嘗試移動功能的實現爲CPP文件,這是爲了防止隱性內聯(通常是更好的風格是這樣)一個常見的方式。