c++ - 变长数组 : How to create a buffer with variable size in C++

标签 c++ variables constructor buffer

我目前正在编写一个移动平均线类。

目标是在创建 Running_Average 类的新对象时能够将缓冲区大小指定为构造函数的一部分。

#include <iostream>
#include "Complex.h"
#include <cmath>
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>

using namespace std;

class Running_Average
{
public:
    double sum = 0;
    double average = 0;
    int i;

    double Average(void); // Member functions declaration
    void AddSample(double);
    Running_Average(int);
};


Running_Average::Running_Average(int size) {
    int buffersize = size;
    double buffer[buffersize] = { 0 };
}

void Running_Average::AddSample(double val)  //Add new values to buffer
{
    for (i = 9; i>0; i--)
    {
        buffer[i] = buffer[i-1];
    }
    buffer[0] = val;
}

double Running_Average::Average(void) //Calculate Average of current values in buffer
{
    for (i = 0; i<buffersize; i++)
    {
        cout << buffer[i] << endl;
        sum += buffer[i];
    }
    average = sum / buffersize;
    sum = 0; 
    return average;
}

int main()
{
    double value;
    int i;
    int f = 0;
    Running_Average test;

    for (i = (40); i < (50); i++)
    {
        test.AddSample(i);
    }

    while (1) 
    {
        i = rand() % 100;
        test.AddSample(i);
        value = test.Average();
        cout << endl;
        cout << value << endl;
        cout << endl; 
        Sleep(1000);
    }

}

但是,构造函数让我很伤心:

Running_Average::Running_Average(int size) {
    int buffersize = size;
    double buffer[buffersize] = { 0 };
}

具体来说:

buffer[buffersize]

在 visual studio 中抛出一个错误:

expression must have a constant size.

我希望用户通过将值传递给构造函数来指定在创建新对象时要使用的缓冲区大小。

如何在不抛出错误的情况下完成这项工作?

感谢您的帮助!

编辑: 已解决!谢谢大家的协助!我设法通过使用 std::vector 来定义可变大小的数组来使函数正常工作。

最佳答案

有很多方法可以做到这一点。从好到坏,我想到的是:

1 使用 std::vector

int buffersize = size;
std::vector<double> buffer(buffersize);

2 内置唯一指针或共享指针(取决于用途)

int buffersize = size;
auto buffer = make_unique<double[]>(buffersize) // C++14

int buffersize = size;
auto buffer = make_shared<double[]>(buffersize) // C++14

3 手动分配

int buffersize = size;
double *buffer = new double[buffersize];

// delete [] buffer, must be called later

4 在堆栈上分配(建议,并且取决于平台)

int buffersize = size;
double *buffer = alloca(buffersize * sizeof(*buffer));

请注意,在所有这些情况下,您都可以像数组一样索引缓冲区。

关于c++ - 变长数组 : How to create a buffer with variable size in C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50575963/

相关文章:

java - 在 Java 中,通过 getter 引用字段与通过变量引用字段之间是否存在性能差异?

c++ - 当父类在 C++ 中没有默认构造函数时,如何在继承类中使用构造函数?

c++ - 我可以在构造函数中使用 setter 吗?

java - 在javascript中读取 session 变量?

C++计算两个数的比值

C++ ostream 引用

c++ - 如何使用 dfs O(n) 打印图形的 MaxPath?

C#:特定于范围的变量绑定(bind)

java - 在对父类(super class)构造函数的 super 调用中使用子类方法作为参数

c++ - FindFirstFile() 可以用来移动文件吗