4

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

讲英语的大多数人的翻译:

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];
//(...)
4

2 回答 2

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 数组的扩展很简单。

于 2013-06-19T18:36:34.227 回答
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++11constexpr关键字旨在使常量表达式更容易在源代码中识别,并可以使用常量进行更高级的编译时计算。)

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

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 这样的库,它支持更简洁的初始化语法。

希望这可以帮助!

于 2013-06-19T18:38:02.237 回答