【问题标题】:How to use included library functions in a C++ header file to define private variables如何在 C++ 头文件中使用包含的库函数来定义私有变量
【发布时间】:2013-08-19 11:46:27
【问题描述】:

我是 C++ 新手,但不会编程,最近开始为 AVR 微控制器编写库。我的库的头文件(Codex.h)看起来像这样..

#ifndef Codex_h
#define Codex_h
#include "Arduino.h"
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

class Codex
{
public:
    void hostIP(int a ,int b ,int c,int d);
    void start(String ID);
    void digitalReadOSC();
    void analogReadOSC();
    void digitalRead();
    void analogRead();
    void receive();
private:
    EthernetUDP _Udp;
    int _pin,_a,_b;
    int _sensorData[52];
    String _nID,_sID,_pID,_snID,_lID,_payloadlen,_payload,_packet;
    char _packetBuffer[25];
    IPAddress _coreIP(000,000,0,00);
};
#endif

现在我再说一遍,我是 C++ 新手,所以我认为我犯了一个简单的错误,但我的编译器在 IPAddress 类型和处理 EthernetUDP 实例创建方面存在问题。 IPAddress 是一个来自 Ethernet.h 库的函数。当我尝试将我的库包含在项目中时,这是我的编译器吐出的内容。

In file included from sketch_aug17b.ino:1:
C:\Program Files (x86)\Arduino\libraries\Codex/Codex.h:19: error: 'EthernetUDP' 
does not name a type
C:\Program Files (x86)\Arduino\libraries\Codex/Codex.h:24: error: 'IPAddress' 
does not name a type

提前感谢您提供的任何帮助,即使只是告诉我去读一本 C++ 书 :)。

【问题讨论】:

  • 你检查过拼写吗? EthernetUdp 也许,基于文件名?也许 IpAddress 有预感...
  • 你检查它们是否在命名空间内?
  • @Reuben 为什么将头文件保存在标准目录中?将用户头文件保留在 Program Files 路径中有点不寻常。它会混淆错误是来自标准标题还是您自己的。
  • 错误明显来自我的头文件,我看不出我的头文件在(/ Program Files)中会增加错误起源的任何歧义。包含的头文件是 arduino IDE 的标准文件。
  • @JonathanLeffler 很擅长,但header 似乎确实是EthernetUDP。 (顺便说一句,这也是我的第一个猜测)。

标签: c++ function header include


【解决方案1】:

正如@WhozCraig 所提到的,类名没有问题,类也不在范围内。所以我最好的猜测是你试图在方法之外实例化一个成员变量 (_coreIP)。你应该先在类声明中声明成员变量,然后在类的构造函数中实例化它。

所以改变这个。

class Codex
{
...
private:
    ...
    IPAddress _coreIP(000,000,0,00);
};

为此

class Codex
{
public:
    ...
    Codex();
private:
    ...
    IPAddress _coreIP;
};

Codex::Codex() :
  _coreIP(000,000,0,00)
{
    ...
}   

您可以直接在类的构造函数上实例化成员变量,使用 : 运算符,如此处所示。

顺便说一句,这是我的第一个答案,所以我希望我做得很好:)

问候

【讨论】:

  • 嗯,没错,但奇怪的是,EthernetUDP 无法正常工作。
  • 感谢您的回答,我解决了它,但仍然有点困惑(C++ 新手)。实际上我确实也遇到了 (_coreIP) 变量的问题,因为我正在尝试初始化它头文件,再次感谢您花时间发布答案。
【解决方案2】:

我的代码现在正在运行,我不确定这是真正的错误还是发生了其他事情,但是在使用我的类的工作程序中包含我的库中所需的外部头文件后,我不再得到任何问题,如果有人可以向我解释为什么会这样,那就太好了。我的新头代码和程序代码。

//(Codex.h)
#ifndef Codex_h
#define Codex_h
#include "Arduino.h"
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

class Codex
{
public:
    void hostIP(int a ,int b ,int c,int d);
    void start(String ID);
    void digitalReadOSC();
    void analogReadOSC();
    void digitalRead();
    void analogRead();
    void receive();
private:
    int _pin,_a,_b;
    int _sensorData[52];
    String _nID,_sID,_ndID,_pID,_snID,_lID,_payloadlen,_payload,_packet;
    char _packetBuffer[25];
    EthernetUDP _Udp;
    IPAddress _coreIP;
};
#endif

这是我的程序,尽管如果我的 .h 和 .cpp 文件中已经声明了我需要的库,我必须在我的程序中再次声明它们似乎不寻常。

#include <Codex.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

Codex codex;
void setup()
{
codex.start("01");  
}
void loop()
{ 
}

【讨论】:

    猜你喜欢
    • 2013-12-25
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多