如何在 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 中编写 类 的简短教程:
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();
这里有几个类似的问题,但我无法让它工作/找到解决方案。
我习惯了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 中编写 类 的简短教程:
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();