类中的常量数组大小

时间:2014-04-28 17:07:24

标签: c++ arrays const constants

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

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。 我为我可怜的英语道歉。

5 个答案:

答案 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;

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