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

2024-04-23

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

Update

根据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::”。

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

Update 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));

Update 3

我在 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 toCommunicationModuleUSB::连接' CommunicationModuleUSB\CommunicationModuleUSB.cpp.o:功能中CommunicationModuleUSB::Connect()': C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference toCommunicationModuleUSB::连接' 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那还不存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 系统地解决CSS中样式冲突

    我的网络项目中有一些来自不同来源的样式表 我想让他们和谐相处 我需要其中一些样式 另一些样式 有没有一种工具或方法可以系统地解决风格冲突 我尝试了 IE8 开发人员工具 是的 可以在每个元素级别查看冲突 但我有很多元素 所以如果我逐个元素地
  • C#中通过HttpWebRequest实现Digest认证

    有谁知道如何筛选使用摘要 http 身份验证的抓取网站 我使用这样的代码 var request HttpWebRequest WebRequest Create SiteUrl request Credentials new Networ
  • 无法隐藏 htaccess 文件

    我很难隐藏我的 htaccess 文件 我仔细检查以确保 httpd conf 中存在以下内容
  • 具有表面梯度的颜色 matplotlibplot_surface 命令

    我想将 surf 命令从MATLAB到plot surface命令中绘图库 我面临的挑战是使用时cmapplot surface 命令中的函数用渐变为表面着色 这里是matlab script Matlab Commands x 5 25
  • 如何通过字符串名称访问结构体属性?

    我有一个结构 typedef struct Tick double open double high double low double close double ema100 Tick 我想访问给定密钥的属性 Tick currentTi
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 如何删除和刷新 Google 缓存页面

    我对网站标题 元关键字和页面上的许多其他更改进行了更改 但谷歌仍然显示旧关键字 谷歌如何反映我所做的最新更改 任何人都可以帮我参考谷歌缓存吗 很抱歉告诉您这一点 但我认为没有人可以帮助您刷新 Google 缓存 您唯一能做的就是等待 直到
  • NOP 雪橇如何工作?

    我找不到回答这个问题的好来源 我知道 nop sled 是一种用于规避缓冲区溢出攻击中堆栈随机化的技术 但我无法理解它是如何工作的 有什么简单的例子可以说明这种方法 128 字节 nop sled 等术语是什么意思 有些攻击包括使程序跳转到
  • Phonegap:将base64图像保存到图库

    我只想保存图像 base64 并在图库中打开它 我不想从画廊获取照片或拍照 img src base64
  • 在尝试找到最长路径的同时消除有向无环图中的无关边

    我问了一个question https stackoverflow com q 8685598 35690关于在可变数量的集合中查找没有重复字符的子序列 解决方案是创建每对字母的矩阵 丢弃每组中未出现的字母 然后找到最长路径 http en
  • getColor(int id) 在 Android 6.0 Marshmallow (API 23) 上已弃用

    The Resources getColor int id 方法已被弃用 ColorInt Deprecated public int getColor ColorRes int id throws NotFoundException re
  • 停止或终止 JDBC 中长时间运行的查询

    有什么方法可以停止或终止 JDBC 中长时间运行的 Oracle 查询吗 通常最终会重新启动应用程序服务器以使 jdbc 与 Oracle DB 断开连接 寻找类似于 SQL Plus 的功能 Kill session在 Java 或 JD
  • jquery 在 Angular 5 中不起作用

    我正在尝试在 Angular 5 中使用 jquery 特别是我正在尝试使用这个库 https codepen io rstrahl pen eJZQej https codepen io rstrahl pen eJZQej 这些是步骤
  • 无法解密指定数据

    sslStream AuthenticateAsServer certificate false SslProtocols Tls SslProtocols Ssl3 SslProtocols Ssl2 true 当我使用上述函数对客户端进
  • 在 R 中转换 HTML 字符实体编码

    R 有没有办法转换 HTML 字符实体编码 我想转换 HTML 字符实体 例如 amp to or gt to gt 对于 Perl 来说 存在 HTML Entities 包可以做到这一点 但我在 R 中找不到类似的东西 我也尝试过ico
  • 如何将日期时间从一个任意时区转换为另一个任意时区

    假设我在请求中收到一个任意日期时间对象 如下所示 它可能来自任何可能的时区 我不知道是哪一个 举例来说 假设它来自东海岸 import pytz from colander import iso8601 ests1 iso8601 pars
  • 在 /usr 下找不到 libmysqlclient。在 Ubuntu 12.4 上从源代码构建 PHP 5.2

    我试图建立PHP 5 2 17从源头开始Ubuntu 12 4 64bit使用此配置 configure prefix opt php5 2 with config file path opt php5 2 with mysql 但我不断收
  • 如何在 JavaScript 中一次出现一个测验问题

    这里是 JavaScript 菜鸟 我正在尝试制作一个正在开发的测验应用程序 但我真的不知道如何继续 我把所有的问题都用html写出来了 情况是这样的 这个测验没有正确答案 只有答案值 该代码应该将每个问题的所有值相加 并根据累积的总分在最
  • 将结构指针转换为另一个结构

    此代码片段打印该值5 我不明白为什么 include
  • 在声明对象之前在全局函数中使用类的成员函数

    我有一个事件处理函数 在该函数中调用了类的成员函数 事件处理函数在类 cpp 文件中声明 但不是类的一部分 它不是成员函数 当我编译代码时 编译器表示该函数在范围内 因为它正在调用全局事件处理函数中的成员函数 我的问题如下 有没有办法在全局