And*_*der 5 c++ variables buffer constructor
我目前正在写一个移动平均班.
目标是在创建类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);
}
}
Run Code Online (Sandbox Code Playgroud)
然而,构造函数给了我悲伤:
Running_Average::Running_Average(int size) {
int buffersize = size;
double buffer[buffersize] = { 0 };
}
Run Code Online (Sandbox Code Playgroud)
特别:
buffer[buffersize]
Run Code Online (Sandbox Code Playgroud)
在visual studio中抛出错误说:
表达式必须具有恒定的大小.
我希望用户在创建新对象时通过将其值传递给他们来指定他们想要使用的缓冲区大小constructor
.
如果不抛出错误,我怎样才能完成这项工作?
谢谢你的帮助!
编辑:解决了!谢谢大家的帮助!我设法通过使用std :: vector来定义一个可变大小的数组来使函数正常工作.
有很多方法可以做到这一点。我想到的从最好到最差的是:
1使用 std::vector
int buffersize = size;
std::vector<double> buffer(buffersize);
Run Code Online (Sandbox Code Playgroud)
2内置唯一指针或共享指针(取决于用途)
int buffersize = size;
auto buffer = make_unique<double[]>(buffersize) // C++14
int buffersize = size;
auto buffer = make_shared<double[]>(buffersize) // C++14
Run Code Online (Sandbox Code Playgroud)
3手动分配
int buffersize = size;
double *buffer = new double[buffersize];
// delete [] buffer, must be called later
Run Code Online (Sandbox Code Playgroud)
4在堆栈上分配(不建议,且取决于平台)
int buffersize = size;
double *buffer = alloca(buffersize * sizeof(*buffer));
Run Code Online (Sandbox Code Playgroud)
请注意,在所有这些情况下,您可以像数组一样索引缓冲区。