类中的常量数组大小

Constant array size in class

本文关键字:数组 常量      更新时间:2023-10-16

我在构造函数中创建数组时遇到问题。看看我的代码:

class foo
{
   private:
     const int size;
     double *tab;
   public:
     foo(int s);
};
foo::foo(int s):size(s)
{
   tab = new double[size][size];
}

构造函数无法创建新数组,因为数组的大小不是常数值。。。怎么了?我打赌这真的很容易。

第页。S我为我糟糕的英语道歉。

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;
}

只有第一个维度可以是可变的。后面的必须是编译时间常数。

tab=新双[大小][10];//例如

在这种情况下,选项卡需要是指向数组的指针:

double(*tab)[10];

如果你需要第二个维度也是可变的,那么你需要做一些事情,比如其他答案。

问题是,在C++中,数组维度需要在编译时已知,可能除了第一个维度,您可以在运行时将其提供给数组new[]运算符。

有几种方法可以修复您的代码:

  • 使CCD_ 3成为CCD_
  • tab设为double**,分配new double*[size],然后分配循环中的各个行,或者
  • 保持tabdouble*,分配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) ) )
{
}

如果你决定采用第二种或第三种方法,请记住遵循三条规则

您需要首先分配一个数组指针数组,然后分配每个单独的数组。如需更深入的讨论,请参阅本文。这是我推荐的代码。不要忘记包括析构函数,正如我在这里展示的那样。

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;
}

使用std::vector of 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;

你真的不应该使用原始指针。