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

时间:2014-08-06 05:55:46

标签: 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 = 0; i<n; i++) {
        array[i] = 0;
    }
}

这不起作用:

//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;
    }
}

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

3 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:3)

如果你只知道运行时的大小,Jason C的答案就是你想要的。 (与juanchopanzas评论)

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

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

runningAverage < 10 > ra;

或者使用std::array等类而不是std::vector

答案 2 :(得分:1)

  1. 您的成员应该是一个指针,以便在构造对象时可以进行动态内存分配:float *array;
  2. 在构造函数中,使用array = new float[a];
  3. 在构造函数中,最好使用memset初始化而不是循环。
  4. 让析构函数使用以下行释放内存:delete[] array;
  5. 要进行编译,您需要以下一行:#include <new>
  6. 要使用-lstdc++,请不要忘记链接标记g++
  7. 由于您似乎是初学者,请查看此有用的参考资料,以便您学习:http://www.cplusplus.com/doc/tutorial/dynamic/