我在构造函数中创建数组时遇到问题。 看看我的代码:
class foo
{
private:
const int size;
double *tab;
public:
foo(int s);
};
foo::foo(int s):size(s)
{
tab = new double[size][size];
}
构造函数无法创建新数组,因为数组的大小不是常量值...这有什么问题?我打赌这很容易。
P.S。 我为我可怜的英语道歉。
答案 0 :(得分:2)
tab
需要是一个双指针,你需要在循环中分别分配第二个维度。
class foo
{
private:
const int size;
double **tab;
public:
foo(int s);
~foo();
};
foo::foo(int s) : size(s)
{
tab = new double*[size];
for (int i = 0; i < size; ++i)
tab[i] = new double[size];
}
foo::~foo()
{
for (int i = 0; i < size; ++i)
delete [] tab[i];
delete [] tab;
}
答案 1 :(得分:1)
只有第一个维度可以变量。后来的必须是编译时常量。
tab = new double [size] [10]; //例如。
在这种情况下,tab需要是指向数组的指针:
double(* tab)[10];
如果您需要第二个维度也是可变的,那么您需要做一些其他答案。
答案 2 :(得分:1)
问题是在C ++中,数组维度需要在编译时知道,除了第一个维度,您可以在运行时提供给数组new[]
运算符。
有几种方法可以修复您的代码:
tab
成为vector<vector<double> >
,让C ++标准库担心管理内存,tab
设为double**
,分配new double*[size]
,然后在循环中分配各个行,或tab
一个double*
,分配new double[size*size]
,并在访问值时进行自己的索引翻译。我认为第一种方法是最好的,因为它可以让您在不编写太多代码的情况下避免潜在的泄漏:
class foo
{
private:
// const int size; <<== You don't need it - tab.size() gives you the size
vector<vector<double>> tab;
public:
foo(int size);
};
foo::foo(int size)
: tab( vector<vector<double> >(size, vector<double>(size, 0.0) ) )
{
}
如果您决定采用第二种或第三种方法,请记住遵循The Rule of Three。
答案 3 :(得分:0)
首先需要分配一个数组指针数组,然后分配每个数组。有关更全面的讨论,请参阅this article。这是我推荐的代码。不要忘记包括我在这里展示的析构函数。
class foo
{
private:
const int size;
double **tab;
public:
foo(int s);
~foo();
};
foo::foo(int s):size(s)
{
tab = new double*[size];
for (int i = 0; i < size; i++)
{
tab[i] = new double[size];
}
}
foo::~foo()
{
for (int i = 0; i < size; i++)
{
delete [] tab[i];
}
delete [] tab;
}
答案 4 :(得分:0)
使用std :: vector of double:
的矢量typedef std::vector< double > double_vector;
typedef std::vector< double_vector > double_2d_vector;
[剪断]
double_2d_vector tab;
[剪断]
foo::foo(int s)
: size(s), tab( s, double_vector( s, 0.0 ) )
{
}
[剪断]
tab[ x ][ y ] = 4.57;
你真的不应该使用原始指针。