在声明对象之前在全局函数中使用类的成员函数
Using member functions of class in global function before declaring object
我有一个事件处理程序函数,在该函数中有一个对类的成员函数的调用。事件处理程序函数在类 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
再次感谢丹尼尔的回复!
我已经根据您的反馈更改了成员功能。但是现在我收到以下错误:
C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB\CommunicationModuleUSB.cpp:77:错误:无法声明成员函数"static void CommunicationModuleUSB::SendBuffer(uint8_t*, int)"以具有静态链接
我已经在头文件中将连接变量设为静态。波纹管是头文件,函数定义形成 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 代码,我现在遇到的唯一问题是在类中声明的连接变量不再在范围内。
我得到的编译器错误如下:C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:79: 未定义对CommunicationModuleUSB::connection'
C:UsersGebruikerDocumentsArduinolibrariesCommunicationModuleUSB/CommunicationModuleUSB.cpp:79: undefined reference to
CommunicationModuleUSB::connection'通信模块USB\通信模块USB.cpp.o:在功能CommunicationModuleUSB::Connect()':
C:UsersGebruikerDocumentsArduinolibrariesCommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference to
通信模块USB::连接'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));
但这有更多的含义。使方法成为静态方法允许它仅访问类的静态成员变量,因为它不属于任何特定对象。但是,这是有意义的,因为调用属于特定对象的方法与调用尚不存在eat()
Carrot
方法相同。
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针