如何在 Arduino 中正确 create/use a class

How to properly create/use a class in Arduino

这里有几个类似的问题,但我无法让它工作/找到解决方案。

我习惯了java,在其中我可以很容易地构造和调用classes,但我无法在arduino 中使用任何东西。经过十几个技巧后,我将它构造成这样:

#include <Servo.h>

Servo CameraServo1;
Servo CameraServo2;
int CameraServo1Pin = 2;
int CameraServo2Pin = 3;
int CameraAngle;
int CameraAngle2;
char incomingCharacter = 0; // Setting up a character variable

void setup() {
  Serial.begin(9600);
  CameraServo1.attach(CameraServo1Pin);
  CameraServo2.attach(CameraServo2Pin);
  //Initialize camera by setting the servo's to the default 90 degree position.
  init.camera();
}

void loop() {
  // Check if something is being received
  if (Serial.available() > 0)
  {
    // read the incoming character:
    incomingCharacter = Serial.read();
    Serial.println("OK!"); // Send OK back to laptop
    switch (incomingCharacter)
    {
      case 'w': // Case block
        ServoControl.forward();
        break;
      case 's': // Case block
        ServoControl.reverse();
        break;
    }
  }
}

class init
{
  public:
    camera();
};

init::camera()
{
  ServoControl.CameraAngle = 90;
  ServoControl.CameraAngle2 = 90;
  CameraServo1.write(90);
  CameraServo2.write(90);
}

class ServoControl
{
    public forward();
    public reverse();
};

ServoControl::reverse()
{
  CameraAngle = CameraAngle - 5;
  CameraAngle2 = CameraAngle2 - 5;
  CameraServo1.write(CameraAngle);
  CameraServo2.write(CameraAngle2);
}

ServoControl::forward()
{
  CameraAngle = CameraAngle + 5;
  CameraAngle2 = CameraAngle2 + 5;
  CameraServo1.write(CameraAngle);
  CameraServo2.write(CameraAngle2);
}

但是我无法让它从 class 调用函数(例如从 class init 调用 void camera)而不给我一个错误,即 init 中的 camera 是一个 void。我真的不明白这里的 classes 是如何工作的,以及为什么 class 中不会出现空白。 :/

检查你的语法。

这里有一个关于如何在 Arduino 中编写 类 的简短教程:

https://www.arduino.cc/en/Hacking/LibraryTutorial

C++ 在某些方面与 Java 非常相似,例如您必须正确声明函数(成员或非成员),包括 return type(您不会为 init::camera 函数执行此操作)。

在其他方面,C++ 与 Java 非常不同,就像您不必为每个成员指定 access/visibility(就像您在 ServoControl class 中所做的那样) .

此外,如果您想使用非静态成员,C++ 和 Java class 都是 抽象描述 ,而不是实际的对象实例class 中的函数你需要先创建一个 class 的实例。

如果您想了解有关 C++ 的更多信息,您可能需要查看 The Definitive C++ Book Guide and List


正如 zstewart 在评论中指出的那样,在 C++ 中您根本不需要 classes。函数在全局范围内可以是独立的,在这种情况下,看起来根本不需要 classes。如果仍然想使用某种范围界定,那么使用 namespace 可能是一个更好的主意。例如

namespace init
{
    void camera()
    {
        ...
    }
}

这个可以这样叫吗

init::camera();