如何从引用(Arduino C++)中设置类类型的变量

How to have a variable be of a class type be set from a reference (Arduino C++)

本文关键字:设置 类型 变量 C++ 引用 Arduino      更新时间:2023-10-16

这似乎是一个简单的问题,但遗憾的是,我对C++的了解不是很好。

因此,我在另一个文件中将Joint声明为类。我希望另一个名为Dancer的类从外部接受Joint实例,并将其保存在自己的实例中。

到目前为止,我有这样的事情。

// Dancer.h
class Dancer {
  public:
    Joint joint;
    void setJoint(Joint newJoint);
    void animate();
}
// Dancer.cpp
Dancer::setJoint(Joint newJoint) {
  joint = newJoint;
}
Dancer::animate() {
  joint.moveTo(random(90));
}
// MainArduinoSketch.ino
Joint frontLeftJoint;
void setup() {
  dancer.setJoint(frontLeftJoint);
}

问题是,我对关节的操作不再有效,尽管我没有出现错误或崩溃。我显然有一个实例,它保存值并响应方法,但它不是同一个实例。这就像我克隆了关节,而不是把关节传来传去。

我有一种预感,我可能需要一些指针来保存引用,但我不确定什么应该是指针,以及如何在通过指针引用的实例上调用方法。

那么,如何更改我上面的代码,使Dancer的实例可以传递给Joint的实例,并使其与joint的实例完全相同呢?

如果你想谈论完全相同的实例,你确实需要使用引用或指针(它们在引擎盖下发生的事情非常相似)。

在这种情况下,选择权落在指针上,因为您只能初始化引用,但以后不能再设置其值。由于您有一个setJoint,这显然是使用指针的原因。

为了保持代码的其余部分基本相同,我们将让setJoint取一个引用参数,然后取其地址以访问指向通过引用传递给函数的内存位置的指针。

当访问我们有指针的对象的成员(无论是数据还是函数)时,有两个选项:您可以取消引用指针,然后像往常一样使用结果对象,也可以使用->运算符一步完成。

把所有东西放在一起,这就是结果:

// Dancer.h
class Dancer {
  public:
    Joint* joint;
    void setJoint(Joint& newJoint);
    void animate();
}
// Dancer.cpp
Dancer::setJoint(Joint& newJoint) {
  joint = &newJoint;
}
Dancer::animate() {
  joint->moveTo(random(90));
}
// MainArduinoSketch.ino
Joint frontLeftJoint;
void setup() {
  dancer.setJoint(frontLeftJoint);
}