在声明对象之前使用全局函数中的类的成员函数

时间:2013-10-26 08:46:16

标签: c++ arduino

我有一个事件处理函数,在该函数中有一个类的成员函数的调用。事件处理函数在类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);
}

更新

Daniel的回复(谢谢!)我将头文件和cpp文件中的成员函数更改为静态,如下所示:

    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:\ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB / CommunicationModuleUSB.h:26:错误:成员'SendBuffer上的额外资格'CommunicationModuleUSB ::'。

有人知道该解决这个问题吗?

更新2

再次感谢Daniel的回复!

我已根据您的反馈更改了会员功能。但现在我收到以下错误:

C:\ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB \ CommunicationModuleUSB.cpp:77:错误:无法声明成员函数'static void CommunicationModuleUSB :: SendBuffer(uint8_t *,int)'具有静态链接

我在头文件中将Connection变量设为静态。 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文件中的函数解除:

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

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

全局函数中的调用:

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

更新3

我已经在Daniel的帮助下更新了te代码,我现在唯一的问题是在类中声明的Connection变量不再在范围内了。

我得到的编译器错误如下: C:\ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB / CommunicationModuleUSB.cpp:79:对CommunicationModuleUSB::connection' C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:79: undefined reference to CommunicationModuleUSB :: connection'的未定义引用 CommunicationModuleUSB \ CommunicationModuleUSB.cpp.o:在函数CommunicationModuleUSB::Connect()': C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference to CommunicationModuleUSB :: connection'中 C:\ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB / CommunicationModuleUSB.cpp:53:对“CommunicationModuleUSB :: connection”的未定义引用

连接变量在头文件中声明如下:

// 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有人建议如何解决这个问题吗?

1 个答案:

答案 0 :(得分: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方法相同。