2013-10-26 2 views
1

У меня есть функция обработчика событий, и в этой функции есть вызов функции-члена класса. Функция обработчика событий объявляется в файле cpp класса, но не является частью класса, она не является функцией-членом.Использование функций-членов класса в глобальной функции перед объявлением объекта

Когда я компилирую код, компилятор говорит, что функция является заметкой в ​​области видимости, потому что она вызывает функцию-член в функции глобального обработчика событий.

Мой вопрос следующий: есть ли способ использовать функцию 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); 
} 

Update

С ответом Даниила (спасибо!) Я изменил функцию-член в файле заголовка и файле cpp на static следующим образом:

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

И функция вызывается в глобальной EventHandler как следует:

// 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: \ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB/CommunicationModuleUSB.h: 26: ошибка: дополнительная квалификация 'CommunicationModuleUSB ::' на члене SendBuffer.

Есть ли у кого-нибудь идеи, кто может это решить?

Обновление 2

Еще раз спасибо Daniel за ваш ответ!

Я изменил функцию-член с вашей обратной связью. Но теперь я получаю следующую ошибку:

C: \ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB \ CommunicationModuleUSB.cpp: 77: error: невозможно объявить функцию-член 'static void CommunicationModuleUSB :: SendBuffer (uint8_t *, int) 'иметь статическую связь

Я сделал переменную Connection static в файле заголовка. 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: 
}; 

Функция decleration в файле CPP:

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

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

и вызов в глобальной функции:

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

Update 3

Я обновил te кода с помощью Daniel, единственная проблема, с которой я столкнулся сейчас, заключается в том, что переменная Connection, объявленная в классе, больше не входит в область.

Ошибка компилятора, что я получаю, как следует: C: \ Users \ Gebruiker \ Documents \ 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: \ Users \ Gebruiker \ Documents \ 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); 

So объявление будет выглядеть так:

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: ошибка: дополнительная квалификация 'CommunicationModuleUSB ::' для участника 'SendBuffer'. Я опубликовал изменения под uptdate: – Roy08

+0

Извините, я допустил ошибку (или я не был ясен в своем объяснении). Вам нужно объявить метод как статический, вам не нужно ставить 'CommunicationModuleUSB ::' впереди. Проверьте мой ответ (через секунду) –

+0

@ Danliel: Еще раз спасибо за ваш ответ. Я использовал вашу обратную связь, но не получаю следующую ошибку: C: \ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB \ CommunicationModuleUSB.cpp: 77: ошибка: не может объявить функцию-член 'static void CommunicationModuleUSB :: SendBuffer (uint8_t *, int) ', чтобы иметь статическую связь. Я изменил Connection на static. Я обновил свой код под обновлением 2 – Roy08

Смежные вопросы