如何创建一个空的全局类并在启动时实例化它

How can I create an empty global class and instantiate it upon startup?

本文关键字:启动 实例化 全局 创建 何创建 一个      更新时间:2023-10-16

我正在构建一个Arduino项目,并希望构建一个可重用的库。然而,我在C#中可以很容易地避开Arduino固件使用的C/C++语法。

我想实例化一个类Foo的全局实例,该实例还包含一个结构Bar,该结构将用于Fooar添加一个新元素,我可以很容易地做到这一点。

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的类,因为这些信息是不可变的,应该是私有的。我不确定这是否是正确的选择,但我读到一些帖子说这是"首选"的做事方式。

如注释中提到的@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();
}