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

时间:2018-11-02 16:07:44

标签: c++ c arduino encapsulation

我正在构建一个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 使用结构而不是类,因为该信息是不可变的,应该是私有的。我不确定这是否是正确的选择,但是我读了几篇文章,指出这是“首选”的处理方式。

1 个答案:

答案 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();
}