如何从引用(Arduino C++)中设置类类型的变量
How to have a variable be of a class type be set from a reference (Arduino C++)
这似乎是一个简单的问题,但遗憾的是,我对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);
}
相关文章:
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- 无法在 HEVC 解码器上设置输出类型 IMFTransform
- Visual Studio 2019 - 设置文件类型的默认扩展名
- 无法在VSCode中设置C++调试;无法识别调试类型
- 将变量设置为类型模板
- 在 C++ 中设置的用户定义数据类型
- 错误:为什么"void*"不是指向对象的指针类型,即使指针设置为对象?
- 为自定义路径类型设置提升property_tree
- 无法将结构类型的标识符设置为 nullptr;
- 空向量占用的空间是否与指向当前设置为 nullptr 的类型的指针一样多
- C++:无法在按位函数后将 int 类型设置为非标量
- 提升区域设置不完整类型boundary_indexing<char32_t>
- 如何用C 中的设置类型解释该方法
- 为 vardiac 和普通模板设置类型名称默认值
- 使用 SWIG 在重载C++方法中设置类型
- 如何动态设置类型
- 如何使用 std::conditional 根据模板参数类型设置类型
- Boost变量:我如何做一个返回已设置类型的访问者