在类中初始化可变大小的数组

use*_*409 2 c++ arrays initialization class arduino

我试图根据构造函数的输入参数初始化一个大小为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用:

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

//Inside .cpp
runningAverage::runningAverage(byte a){
    n = a;
    for (byte i = 0; i<n; i++) {
        array[i] = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想初始化数组,这是由n指定的大小.这样我就不会通过任意指定float数组[256]或类似的东西来浪费内存.任何帮助表示赞赏!

Jas*_*n C 6

你必须实际分配数组; 并且你想要使用指针类型,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;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您有一些动态的自动容器(例如std::vector),您可能希望使用它 - 那么您不必处理复制/分配/析构/内存管理.

  • 最好还提供复制和赋值运算符,或禁用这些操作. (2认同)
  • 顺便说一句,你不需要构造函数中的循环,你可以像这样对数组元素进行零初始化:`array = new float [n]();`. (2认同)