【问题标题】:Using member functions of class in global function before declaring object在声明对象之前在全局函数中使用类的成员函数
【发布时间】:2013-10-26 08:46:15
【问题描述】:

我有一个事件处理函数,在该函数中调用了一个类的成员函数。事件处理函数在类 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:\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)' 具有静态链接

我已在头文件中将 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));

更新 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::connection 的引用 CommunicationModuleUSB\CommunicationModuleUSB.cpp.o:在函数CommunicationModuleUSB::Connect()': C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference toCommunicationModuleUSB::connection' C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference to `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);
}

And 用于以下全局事件处理函数:

// 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));
}

有没有人建议如何解决这个问题?

【问题讨论】:

    标签: c++ arduino


    【解决方案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));
    

    但这有更多的含义。将方法设为静态允许它仅访问类的静态成员变量,因为它不属于任何特定对象。但是,这是有道理的,因为调用属于特定对象的方法与调用尚不存在的 Carroteat() 方法相同。

    【讨论】:

    • @丹尼尔:谢谢你的评论。当我将函数更改为静态时,我得到以下编译器错误。 C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.h:26:错误:成员“SendBuffer”上的额外限定“CommunicationModuleUSB::”。我在 updatedate 下发布了更改:
    • 对不起,我犯了一个错误(或者我的解释不清楚)。您需要将方法声明为静态,您不需要将CommunicationModuleUSB:: 放在前面。检查我的答案(一秒钟)
    • @Danliel:再次感谢您的回复。我使用了您的反馈,但没有收到以下错误:C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB\CommunicationModuleUSB.cpp:77: error: cannot declare member function 'static void CommunicationModuleUSB::SendBuffer(uint8_t*, int)' 具有静态链接。我将连接更改为静态。我在更新 2 下更新了我的代码
    • @Roy08 对不起,我匆忙修好了它,因为我不得不去,所以我在定义中留下了static。我在上面修复了我的代码,它现在应该可以正常工作了。
    • @丹尼尔:再次感谢您的回复!我明天试试这个。我有一个问题: static void CommunicationModuleUSB::SendBuffer(uint8_t * Buffer, int Size);我需要把这个defenition放在一个单独的文件中吗?如果是这样,在哪里?或者我是否像这样在我的类头文件中声明它:static void SendBuffer(uint8_t * Buffer, int Size);再次感谢您的 cmets 和迄今为止的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2014-08-05
    • 2017-12-17
    相关资源
    最近更新 更多