作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在编写一个移动平均线类。
目标是在创建 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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!