当field为const时,将'非常量表达式作为数组绑定'

时间:2013-06-19 18:26:19

标签: c++ arrays multidimensional-array

我正在尝试使用我的常量字段作为其维度来定义多维数组,但是我得到一个编译错误,表示该表达式不是常量。有没有其他方法可以这样做,所以我可以使用构造函数初始化列表中定义的常量字段作为数组维度?

英语占多数的翻译:

class FunctionWave2D : public DisallowedDomainPoints
{
protected:
    double th; 
    double l; a
    double d, dd; 
    const int number_sqrt;  //here's the constant

    double **second_derivatives;

protected:
    bool elasticTenstionOnly;

public:
    FunctionWave2D(int number, double elasticModulus, double dampingFactor, double oscillationDampingFactor, double length)
        :DisallowedDomainPoints(number * LAYER_COUNT),
        th(elasticModulus), d(dampingFactor), dd(oscillationDampingFactor),
        elasticTensionOnly(false),
        l(length/(sqrt(number)-1)),
        number_sqrt(sqrt(number))
    {   
        second_derivatives = new double[number_sqrt][number_sqrt][LAYER_COUNT];
//(...)

2 个答案:

答案 0 :(得分:5)

数组绑定必须是编译时常量。非静态const数据成员不是编译时常量;它在构造对象时在运行时获取其值。

因此,基本上,如果您需要在运行时设置该数组的大小,则必须使用operator new[]构建所有部分。从本质上讲,

int **data_2d = new int*[runtime_size];
for (int i = 0; i < runtime_size; ++i)
    data_2d[i] = new int[runtime_size];

3d数组的扩展很简单。

答案 1 :(得分:5)

在C ++中,术语“常量表达式”特指一个表达式,其值在编译时是已知的。它与const变量不同。例如,137是一个常量表达式,但在此代码中:

int function(int x) {
    const int k = x;
}

k的值不是常量表达式,因为它的值无法在编译时确定。

在您的情况下,您有一个声明为

的数据成员
 const int ilosc_sqrt;  //here's the constant

即使标记为const,它的值在编译时也是未知的。它在初始化列表中初始化为

ilosc_sqrt(sqrt(ilosc))

在程序实际运行之前无法确定此值,因此出现错误。 (请注意,新的C ++ 11 constexpr关键字的设计使得常量表达式在源代码中更容易识别,并且可以使用常量进行更多的编译时计算。 )

要解决此问题,您需要将初始化分成更小的步骤:

drugie_pochodne = new double**[ilosc_sqrt];
for (int i = 0; i < ilosc_sqrt; i++) {
    drugie_pochodne[i] = new double*[ilosc_sqrt];
    for (int j = 0; j < ilosc_sqrt; j++) {
        drugie_pochodne[j] = new double[ILOSC_WARSTW];
    }
}

或者使用像Boost.MultiArray这样的库,它支持更清晰的初始化语法。

希望这有帮助!