我正在构建一个Arduino项目,并希望构建一个可重用的库。但是,我在C#中可以轻松完成的工作使我不知道Arduino固件使用的C / C ++语法。
我想实例化一个类 Foo 的全局实例,该实例还包含一个结构 Bar ,该结构将在 Foo 的构造函数中使用。所以我可以利用封装的优势,例如如果我需要在 Bar 中添加新元素,则可以轻松实现。
C#
Foo myFoo;
void BobBobLaw()
{
Bar myBar = new Bar();
myBar.A = 1;
myBar.B = 2;
myBar.C = 3;
myFoo = new Foo(myBar);
myFoo.DoSomething();
}
如何为Arduino平台完成类似的工作?顺便说一句,我选择对 Bar 使用结构而不是类,因为该信息是不可变的,应该是私有的。我不确定这是否是正确的选择,但是我读了几篇文章,指出这是“首选”的处理方式。
答案 0 :(得分:1)
如评论中提到的@Lightness Races in Orbit
。您可以在全局上下文中声明指向Foo的指针,并在setUp函数中使用新的Foo对象在全局指针中进行初始化。
使用struct
不会使Bar不可变。在C ++中,结构是等效于类的,只是默认访问说明符是公共的。使Bar不可变的一种方法是将成员设为私有,并确保只有构造函数才能对其进行修改。
下面的示例给出了一个这样的示例,其中不可变的Bar作为Foo类的成员。我希望您觉得它有用。
#include <iostream>
#include <string>
class Bar {
private:
int A,B,C;
public:
Bar(int a,int b, int c):A(a),B(b),C(c){};
int getA() const { return A; }
int getB() const { return B; }
int getC() const { return C; }
};
class Foo {
private:
Bar *mBar;
public:
Foo(Bar barInstance) {
mBar = new Bar(barInstance.getA(),barInstance.getB(),barInstance.getC());
}
void DoSomething() {
std::cout<<"Doing something";
}
};
Foo *fooPointer;
void setUpArduino() {
Bar myBar(1,2,3);
fooPointer = new Foo(myBar);
fooPointer->DoSomething();
}
int main() {
setUpArduino();
}