[英]Using member functions of class in global function before declaring object
我有一个事件处理函数,在该函数中有一个类的成员函数的调用。 事件处理函数在类cpp文件中声明,但不是类的一部分,它不是成员函数。
当我编译代码时,编译器会说该函数是作用域中的注释,因为它正在全局事件处理程序函数内调用成员函数。
我的问题如下:是否可以在全局函数中使用成员函数? (首先在运行时创建对象)。
下面是成员函数和全局事件处理程序:
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,如下所示:
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 ::'。
有人知道谁可以解决这个问题吗?
再次感谢Daniel的回复!
我已经根据您的反馈更改了成员函数。 但是现在我得到以下错误:
C:\\ Users \\ Gebruiker \\ Documents \\ Arduino \\ libraries \\ CommunicationModuleUSB \\ CommunicationModuleUSB.cpp:77:错误:无法声明成员函数'static void CommunicationModuleUSB :: SendBuffer(uint8_t *,int)'具有静态链接
我已经在头文件中将Connection变量设为静态。 波纹管是头文件,而功能定义则是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));
我已经在Daniel的帮助下更新了代码,我现在唯一的问题是在类中声明的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' 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 :: connection的CommunicationModuleUSB::Connect()': C:\\Users\\Gebruiker\\Documents\\Arduino\\libraries\\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference to
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));
}
有人建议如何解决这个问题吗?
成员函数是成员函数,这是有原因的。 您正在调用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));
但是这具有更多的含义。 将方法设为静态允许它仅访问该类的静态成员变量,因为它不属于任何特定对象。 但是,这很有意义,因为调用属于特定对象的方法与调用尚未存在的Carrot
eat()
方法相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.