C++ 初始化类内大小可变的数组

C++ 初始化类内大小可变的数组,c++,arrays,class,arduino,initialization,C++,Arrays,Class,Arduino,Initialization,我试图根据构造函数的输入参数初始化大小为n的数组。 这项工作: //Inside Header class runningAverage{ private: byte n; float array[10]; public: runningAverage(byte); }; //Inside .cpp runningAverage::runningAverage(byte a){ n = a; for (byte i

我试图根据构造函数的输入参数初始化大小为n的数组。 这项工作:

//Inside Header
class runningAverage{
    private:
        byte n;
        float array[10];
    public:
        runningAverage(byte);
};

//Inside .cpp
runningAverage::runningAverage(byte a){
    n = a;
    for (byte i = 0; i<n; i++) {
        array[i] = 0;
    }
}
//内部标题
班级平均成绩{
私人:
字节n;
浮点数组[10];
公众:
运行平均值(字节);
};
//内部。cpp
runningAverage::runningAverage(字节a){
n=a;

对于(字节i=0;i您必须实际分配数组;并且您需要使用指针类型,
float array[]
不是您所认为的那样。正如juanchopanza提醒我们的那样,您还需要禁用复制构造函数和赋值运算符,或者实现执行正确深度复制的构造函数和赋值运算符

//Inside Header
class runningAverage{
    private:
        byte n;
        float *array; // <= correct type
    public:
        runningAverage(byte);
        ~runningAverage(); // <= you'll need a destructor to cleanup
    private:
        runningAverage(const runningAverage &);
        runningAverage & operator = (const runningAverage &);
};

//Inside .cpp
runningAverage::runningAverage(byte a){
    array = new float[n]; // <= allocate array
    n = a;
    for (byte i = 0; i<n; i++) {
        array[i] = 0;
    }
}

// clean up
runningAverage::~runningAverage(){
    delete[] array;
}
//内部标题
班级平均成绩{
私人:
字节n;

float*array;//如果您只知道运行时的大小,Jason C的答案就是您想要的

如果在编译时已知大小,则可以使用模板:

template < int SIZE >
class runningAverage
{
    float array [ SIZE ];
};

runningAverage < 10 > ra;
模板
班级平均成绩
{
浮点数组[大小];
};
运行平均<10>ra;
或者使用类似于
std::array
的类,而不是
std::vector

  • 您的成员应该是指针,以便在构造对象时可以进行动态内存分配:
    float*array;
  • 在构造函数中,使用
    array=newfloat[a];
  • 在构造函数中,最好使用
    memset
    而不是循环进行初始化
  • 使用析构函数释放内存,该行为:
    delete[]array;
  • 要将其编译,您需要这一行:
    #include
  • 要链接,请不要忘记在使用
    g++
    时包含链接器标志
    -lstdc++


  • 由于您似乎是一名初学者,请查看以下有用的参考资料以供您学习:

    另外值得注意的是,这是为arduino库编写的!初始化数组时,您需要传递一些值。因此,当您从用户处收到n的值时,您需要传递该值。请阅读有关指针和
    新建
    &
    删除
    in C++,这将允许你创建一个数组,它希望知道这些东西的相关内容,但是我不知道它是如何关联的。你能给我写个例子吗?最好也提供拷贝和赋值操作符,或者禁用这些操作。哇,谢谢。这解决了我的问题。只是几个问题。如果真的永远不存在,你真的需要析构函数吗?让我直截了当地说,数组被声明为指向一个浮点的指针,您正在为数组分配内存?为什么删除后会有方括号?什么是复制和赋值运算符?@juanchopanzaBTW如果您不需要构造函数中的循环,您可以像这样对数组元素进行零初始化:
    array=new float[n]();
    @user3912409。你应该养成在需要特殊清理时总是定义析构函数的习惯,这有十几个非常好的理由。我经常看到编译器将这样的循环和memset简化为相同的东西。@JasonC Ant将数组归零初始化的惯用方法既不是循环也不是
    memset
    ,而是
    数组=新的浮点[a](;);< /COD>这是很好的。我多年来没有用C++编写。很好的刷新。也不需要包含<代码> <代码>(除非你想使用<代码> STD::BADYOLLC/和<代码> STD::Nojp< /Cord>)对于这一点,
    g++
    隐式链接到libstdc++。您提供的源代码对我帮助很大。非常感谢。使用这种方法比Jason的方法有优势吗?我没有任何模板经验…@user3912409有优点和缺点,这个主题在许多其他地方讨论过,这里有很多内容要讨论。在某些情况下,jasons的答案更适合,在某些情况下,我的答案更适合。与您的需求无关的唯一优势是,我的方法不需要您处理复制/赋值运算符。但是,如果您只使用
    std::vector
    ,这个问题也会为您解决。所有其他(dis)每种方法的优点取决于您实际使用此代码的目的,所以我不能在这里回答。哦,是的,我忘记了:我的代码的缺点就像我在回答中所说的,您需要在编译时知道大小。
    template < int SIZE >
    class runningAverage
    {
        float array [ SIZE ];
    };
    
    runningAverage < 10 > ra;