在使用全局函数类的成员函数声明对象之前(Using member functions of clas

2019-10-18 20:38发布

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

更新

丹尼尔(谢谢!)的答复我在头文件和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:\用户\ Gebruiker \文件\ Arduino的\库\ CommunicationModuleUSB / CommunicationModuleUSB.h:26:错误:额外资格 'CommunicationModuleUSB ::' 上构件“SendBuffer。

没有任何人有一个想法谁解决呢?

更新2

再次感谢丹尼尔您的回复!

我已经改变了成员函数与您的反馈意见。 但现在我得到以下错误:

C:\用户\ Gebruiker \文件\ Arduino的\库\ CommunicationModuleUSB \ CommunicationModuleUSB.cpp:77:错误:不能声明成员函数 '静态无效CommunicationModuleUSB :: SendBuffer(uint8_t *,INT)' 为有静态链接

我已经在头文件中的连接静态变量。 波纹管是头文件和功能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));

更新3

我已经更新了丹尼尔的帮助德代码,我现在唯一的问题是,在类中声明的连接变量不在范围了。

编译器错误,我得到的是如下: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));
}

美国能源部任何人有一个建议如何解决这个问题?

Answer 1:

成员函数是一个成员函数,这是有原因的。 您呼叫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尚不存在。



文章来源: Using member functions of class in global function before declaring object
标签: c++ arduino