我正在制作一个多项式程序,下面是我为它编写的代码。
class Polynomial{
private:
int n; //n = degree of polynomial
double a[n]; //a = array of coefficients where a[i] is the coefficient of x^i
double roots[n];
double maxima[n-1],minima[n-1],inflection[n-1]; //arrays of coordinates of maxima, minima and points of inflection
这只是头文件中类Polynomial的一部分。当我尝试编译时,它给了我以下错误
invalid use of non-static data member int n;
当我使n静态时,它会给我以下错误
array bound is not an integer constant before ‘]’ token
这是在单独编译头文件时。我究竟做错了什么?
答案 0 :(得分:1)
您的类包含VLA(变量长度数组),而不是 在C ++中受支持。
您需要通过使n
保持不变来确定大小
或者使用另一种动态的容器,std :: vector
是一个类似于数组的容器,但它是动态的,即可以
在运行时扩展。
class Polynomial
{
static const int n = 10;
double a[n];
...
class Polynomial
{
std::vector<double> a;
答案 1 :(得分:0)
您可以使用new
在构造函数中简单地分配所有这些内容。
或使用矢量。
class Polynomial
{
vector<double> a;
Polynomial()
{
a.assign(n,0);
...
}
..
};
答案 2 :(得分:0)
必须在编译时知道C样式数组的大小。
如果n
实际上在编译时已知,则可以将其设为模板参数而不是成员变量。
如果没有,那么您将不得不使用其他容器,例如vector<double> a, roots, maxima, minima, inflection;
。
答案 3 :(得分:0)
没有陷入并发症,
简单的答案是,要使静态内存分配起作用(这是您尝试使用double a[n];
),您需要在编译时知道数组的大小。
但是,如果你甚至在程序运行之前就不知道数组的大小,而是希望在程序运行期间的某个地方知道它,那么你需要使用动态内存分配
要做到这一点,你必须
和
new
指令然后再
delete
括号的[]
指令释放您分配的内存以指示编译器为多个连续变量释放内存。做类似的事情:
class Polynomial{
private:
int n; //n = degree of polynomial
double *a; //a = array of coefficients where a[i] is the coefficient of x^i
double *roots;
double *maxima,*minima,*inflection; //arrays of coordinates of maxima, minima and points of inflection
public:
Polynomial( int degree_of_polynomial ){
n = degree_of_polynomial;
a = new double[n];
roots = new double[n];
maxima = new double[n-1];
minima = new double[n-1];
inflection = new double[n-1];
~Polynomial(){
delete []a;
delete []roots;
delete []maxima;
delete []minima;
delete []inflection;
}
}
有关动态内存分配的更详细说明,请参阅此link。