使用类与Arduino

38

我正在尝试在Arduino中使用类对象,但总是遇到问题。我想做的只是声明一个类并创建一个该类的对象。有什么例子吗?

6个回答

21

在Arduino 1.0上,这段代码可以成功编译:

class A
{
  public:
   int x;
   virtual void f() { x=1; }
};

class B : public A
{
  public:
    int y;
    virtual void f() { x=2; }
};


A *a;
B *b;
const int TEST_PIN = 10;

void setup()
{
   a=new A(); 
   b=new B();
   pinMode(TEST_PIN,OUTPUT);
}

void loop()
{
   a->f();
   b->f();
   digitalWrite(TEST_PIN,(a->x == b->x) ? HIGH : LOW);
}

注意,我没有虚析构函数 --- 构建动态对象似乎没问题,但删除可能会导致碎片化,所以我不认为做更多的事情比动态配置您的环境好。 - Warren MacEvoy
第11行不应该是int y;而是int x;吗? - stib
不,类型 B 的对象只有 x 和 y 属性。 - Warren MacEvoy

13

这里有一篇关于如何在Arduino平台上创建库的绝佳教程 一个库基本上是一个类,所以它应该向您展示如何完成所有操作。

在Arduino中,您可以使用类,但有几个限制:

  • 没有new和delete关键字
  • 没有异常
  • 没有libstdc ++,因此没有标准函数、模板或类

您还需要为您的类创建新文件,不能只在主程序中声明它们。重新编译库时,您还需要关闭Arduino IDE。这就是为什么我将Eclipse用作我的Arduino IDE的原因。


11
Arduino 1.0.6 上使用 new/delete 完全没问题。 - Pointer Null
在v2.0.0中,在您的主要草图中声明类是可以的。 - Robert M.

6

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955 中提到:

By default, the Arduino IDE and libraries does not use the operator new and operator delete. It does support malloc() and free(). So the solution is to implement new and delete operators for yourself, to use these functions.

Code:

#include <stdlib.h> // for malloc and free
void* operator new(size_t size) { return malloc(size); } 
void operator delete(void* ptr) { free(ptr); }
这让您可以创建对象,例如:
C* c; // declare variable
c = new C(); // create instance of class C
c->M(); // call method M
delete(c); // free memory

问候, tamberg


4

我之前创建了这个简单的项目。主要的挑战是创建一个良好的构建环境 - 一个可以编译、链接/部署所有内容而不必使用GUI的 makefile。以下是代码中的头文件:

class AMLed
{
    private:
          uint8_t _ledPin;
          long _turnOffTime;

    public:
          AMLed(uint8_t pin);
          void setOn();
          void setOff();
          // Turn the led on for a given amount of time (relies
          // on a call to check() in the main loop()).
          void setOnForTime(int millis);
          void check();
};

这是主要的源代码

AMLed::AMLed(uint8_t ledPin) : _ledPin(ledPin), _turnOffTime(0)
{
    pinMode(_ledPin, OUTPUT);
}

void AMLed::setOn()
{
    digitalWrite(_ledPin, HIGH);
}

void AMLed::setOff()
{
    digitalWrite(_ledPin, LOW);
}

void AMLed::setOnForTime(int p_millis)
{
    _turnOffTime = millis() + p_millis;
    setOn();
}

void AMLed::check()
{
    if (_turnOffTime != 0 && (millis() > _turnOffTime))
    {
        _turnOffTime = 0;
        setOff();
    }
}

这里有更漂亮的格式:http://amkimian.blogspot.com/2009/07/trivial-led-class.html

使用方法很简单,在.pde文件中只需像这样:

#include "AM_Led.h"

#define TIME_LED    12   // The port for the LED

AMLed test(TIME_LED);

1
你如何将 test 作为另一个函数的参数传递?这种类的函数签名是什么样子的?如果你不使用 new AMLed(TIME_LED),那么 AMLed test(TIME_LED) 会是什么样子?我问这个问题是因为我有两个对象,都是 AMLed 类型的,并且我想在一个函数中引用它们。 - Samuel Clay
@SamuelClay AMLed test(TIME_LED) 行调用了构造函数。由于对象已经创建,因此不需要使用 new - Anton

1

您能提供一个未成功的示例吗?正如您可能知道的那样,Wiring语言基于C/C++,但是并不支持所有的C++语法

无论您是否允许在Wiring IDE中创建类,我不确定(我的第一台Arduino现在正在邮寄中)。我知道,如果您编写了一个C++类,使用AVR-GCC编译它,然后使用AVRDUDE将其加载到Arduino上,它将可以工作。


1

我的Webduino库全部基于一个C++类,该类在Arduino以太网盾的顶部实现了一个Web服务器。我在.h文件中定义了整个类,任何Arduino代码都可以#include它。随意查看代码,了解我是如何做到的...最终,我只是将其全部定义为内联,因为没有真正的理由使用Arduino IDE分别编译对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接