2013-10-26 61 views
1

我有一個事件處理函數,並且在該函數中有一個對類的成員函數的調用。事件處理函數是在類cpp文件中聲明的,但不是類的一部分,它不是成員函數。在聲明對象之前在全局函數中使用class的成員函數

當我編譯代碼時,編譯器說這個函數是在範圍中註釋的,因爲它調用了全局事件處理函數中的成員函數。

我的問題是:有沒有辦法在全局函數中使用meber函數? (該對象在運行時首先創建)。

下面是成員函數和全局事件處理程序:

Global event handler: 

void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t *  data) 
{ 
    Serial.println("In data recieve handler"); 


    Serial.println("Data recieved: "); 
    Serial.println(data[0]); 
    Serial.println(data[1]); 

    char a = data[0]; 
    char b = data[1]; 

    Serial.println(a); 
    Serial.println(b); 
    //uint16_t data2 = data; 

    // Member function of USBCommunicator class 
    SendBuffer(data, sizeof(data)); 

}

成員函數:

void CommunicationModuleUSB::SendBuffer(uint8_t * Buffer, int Size){ 

    connection->write(Size,(uint8_t*)&Buffer); 
} 

更新

與丹尼爾的回覆(謝謝! )我將頭文件和cpp文件中的成員函數更改爲static,如下所示:

static void CommunicationModuleUSB::SendBuffer(uint8_t* Buffer, int Size); 

而作爲跟隨函數被調用的全球事件處理程序:

// Event handler for shell connection; called whenever data sent from Android to Microcontroller 
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t *  data) 
{ 
    Serial.println("In data recieve handler"); 


    Serial.println("Data recieved: "); 
    //Serial.println(*data); 
    Serial.println(data[0]); 
    Serial.println(data[1]); 

    char a = data[0]; 
    char b = data[1]; 

    Serial.println(a); 
    Serial.println(b); 
    //uint16_t data2 = data; 

    CommunicationModuleUSB::SendBuffer(data, sizeof(data)); 


} 

只有現在我得到以下錯誤,當我編譯:

C:\用戶\ Gebruiker \文件\ Arduino \ libraries \ CommunicationModuleUSB/CommunicationModuleUSB.h:26:錯誤:成員'SendBuffer上的額外資格'CommunicationModuleUSB ::'。

有誰知道誰來解決這個問題?

更新2

再次感謝丹尼爾的回覆!

我已將您的反饋更改爲成員函數。但現在我得到以下錯誤:

C:\ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB \ CommunicationModuleUSB.cpp:77:錯誤:無法聲明成員函數'靜態void CommunicationModuleUSB :: SendBuffer(uint8_t *, int)'有靜態鏈接

我已經使頭文件中的連接變量靜態。 Bellow是頭文件和函數deffenition形成cpp文件。

你(或其他人)有任何線索嗎?歡迎所有建議!

頭文件

#include "CommunicationModule.h" 
#include <SPI.h> 
#include <Adb.h> 

class CommunicationModuleUSB : public CommunicationModule 
{ 
    public: 

CommunicationModuleUSB(); 

int Connect(); 
     void Send(); 
int CheckConnection(); 
     void Recieve(); 
static void SendBuffer(uint8_t* Buffer, int Size); 

void RecieveBuffer(char Buffer[], int Size); 

// Adb connection made this static....(is this right? 
static Connection * connection; 

// Elapsed time for sensor sampling 
long lastTime; 

     private: 
}; 

在cpp文件的功能decleration:

static void CommunicationModuleUSB::SendBuffer(uint8_t* Buffer, int Size){ 

    connection->write(Size,(uint8_t*)&Buffer); 
} 

並在全局函數調用:

CommunicationModuleUSB::SendBuffer(data, sizeof(data)); 

更新3

我已更新te代碼在Daniel的幫助下,現在唯一的問題是在類中聲明的Connection變量不在範圍內。

編譯器錯誤,我得到的是如下: C:\用戶\ Gebruiker \文件\ Arduino的\庫\ CommunicationModuleUSB/CommunicationModuleUSB.cpp:79:未定義參照CommunicationModuleUSB::connection' C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:79: undefined reference to CommunicationModuleUSB ::連接」 CommunicationModuleUSB \ CommunicationModuleUSB。 cpp.o:在功能CommunicationModuleUSB::Connect()': C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference to CommunicationModuleUSB ::連接 ' C:\用戶\ Gebruiker \文件\ Arduino的\庫\ CommunicationModuleUSB/CommunicationModuleUSB.cpp:53:未定義參考`CommunicationModuleUSB ::連接'

連接可變在頭文件中聲明如下:

// Adb connection made this static....(is this right? 
     static Connection * connection; 

變量將在下面的成員函數使用:

void CommunicationModuleUSB::SendBuffer(uint8_t* Buffer, int Size){ 

connection->write(Size,(uint8_t*)&Buffer); 
} 

並且在以下全局事件處理功能用於:

// Event handler for shell connection; called whenever data sent from Android to Microcontroller 
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data) 
{ 
    Serial.println("In data recieve handler"); 


    Serial.println("Data recieved: "); 
    Serial.println(data[0]); 
    Serial.println(data[1]); 

    char a = data[0]; 
    char b = data[1]; 

    Serial.println(a); 
    Serial.println(b); 

    CommunicationModuleUSB::SendBuffer(data, sizeof(data)); 
} 

Doe的人有一個建議如何解決這個?

回答

2

成員函數是成員函數,這是一個原因。你調用SendBuffer()就好像它是在全局範圍內定義的普通函數一樣,事實並非如此。您可以通過兩種方式調用成員函數。

第一:你創建一個類的實例,然後調用方法:

CommunicationModuleUSB cm(); 
cm.SendBuffer(data, sizeof(data)); 

二:你做的方法static所以它的簽名如下:

static void CommunicationModuleUSB::SendBuffer(uint8_t * Buffer, int Size); 

所以聲明看起來是這樣的:

class CommunicationModuleUSB 
{ 
    //Other stuff 
    static void SendBuffer(uint8_t * Buffer, int Size); 
    //Other stuff 
} 

和你定義的函數:

void CommunicationModuleUSB::SendBuffer(uint8_t * Buffer, int Size) 
{ 
    //Your code 
} 

現在你可以這樣調用:

CommunicationModuleUSB::SendBuffer(data, sizeof(data)); 

但是這更多的含義。使該方法成爲靜態方法允許它只訪問該類的靜態成員變量,因爲它不屬於任何特定的對象。然而,這是有意義的,因爲調用屬於特定對象的方法與調用eat()方法Carrot的方法相同,但該方法尚不存在。

+0

@ Daniel:感謝您的評論。當我將該函數更改爲靜態時,出現以下編譯器錯誤。 C:\ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB/CommunicationModuleUSB.h:26:錯誤:成員'SendBuffer'上額外限定'CommunicationModuleUSB ::'。我在uptdate下發布了更改: – Roy08

+0

對不起,我犯了一個錯誤(或者我的解釋不清楚)。你需要聲明這個方法是靜態的,你不需要把'CommunicationModuleUSB ::'放在前面。檢查我的答案(一秒鐘) –

+0

@ Danliel:再次感謝您的回覆。我用你的反饋,但沒有我得到以下錯誤:C:\ Users \ Gebruiker \ Documents \ Arduino \庫\ CommunicationModuleUSB \ CommunicationModuleUSB.cpp:77:錯誤:無法聲明成員函數'靜態無效CommunicationModuleUSB :: SendBuffer(uint8_t *, int)'有靜態鏈接。我將Connection更改爲static。我更新了我的代碼,更新2 – Roy08

相關問題