2016-02-28 139 views
2

我需要一个固定宽度和高度的二维数组,只能改变存储在其中的各个值。它在头文件中声明,并在源文件中初始化。如何初始化int * const * const?

我发现让我尝试了下面的代码片段;不幸的是,问题是关于1d或非常量数组,并且与我的情况不符。

int *const *const a = new int[10][10]; 
int *const *const b = new int[10][10](); 
int *const *const c = new int*[10]; 
for (int i = 0; i < 10; ++i) { 
    c[i] = new int[10]; 
} 

我希望是最后一个例子,但我该如何使用,如果他们不会被初始化“内部”的c阵列,我不能初始化它们因为它们是常量?

我不需要这个数组的不同类型吗?我在考虑int d[][],但它没有恒定的宽度和高度。
在我看来,似乎是一个悖论(如果它存在于C++世界中),我错过了什么?

+2

2D阵列具有固定的宽度和高度将是'的INT A [10] [10]'。你正在创建指针数组。 – molbdnilo

+0

这迫使我知道标题中的大小,但我还不知道。这就是为什么我想要int * const * const声明。 –

+0

还是有这样的数组是一个坏主意?我可以从标题中删除它,并有一个getter,但这不是一个矫枉过正的?即使这样,是否不可能初始化这样的数组?那他们为什么会存在? –

回答

2

我正在考虑int d[][],但它没有固定的宽度和高度。

int d[][]没有意义(并且将被编译器拒绝)。就多维数组而言,只有第一维的大小可以省略以表示不完整的类型。其他尺寸的尺寸是该类型的一部分。你不能忽略它们,就像你不能省略int一样。

换句话说,如果您有类似int d[5][10]的东西,那么您可以将其视为元素类型为int[10]的一维数组。通常,将多维数组看作一维数组的特例。它会让所有的事情更容易理解。


您的问题的最佳解决方案在C++是创建私人std::array<T, Width * Height> data;int width成员变量在类中,并计算在阵列中一个公共成员函数从个别的X和Y参数的偏移,例如:

T& operator()(int x, int y) 
{ 
    return data[y * width + x]; 
} 

如果尺寸在运行时只知道,那么你必须改变的唯一事情是使用std::vector代替std::array。存储将仍然是连续的。

下面是一个完整的例子:

#include <vector> 
#include <iostream> 

class Matrix 
{ 
public: 
    Matrix(int width, int height, int value) : 
     width(width), 
     data(width * height, value) 
    {} 

    int& operator()(int x, int y) 
    { 
     return data[y * width + x]; 
    } 

private: 
    int width; 
    std::vector<int> data; 
}; 

int main() 
{ 
    Matrix m(5, 10, 123); 
    std::cout << m(7, 8) << "\n"; 
    m(7, 8) = 124; 
    std::cout << m(7, 8) << "\n"; 
} 
+0

谢谢,我现在觉得这个方法更好。 –

1

我希望是在最后一个例子,但我该如何使用C的“内部”的阵列,如果他们不被初始化和我不能初始化它们,因为它们是const

这不是真的在所有:

int * const * const c = new int*[10] 
{ 
    new int[10], new int[10], new int[10], new int[10], new int[10], 
    new int[10], new int[10], new int[10], new int[10], new int[10] 
}; 
+0

是的,但OP添加了评论 - “这迫使我知道标题中的大小,我还不知道,这就是为什么我需要int * const * const声明。” – zoska

相关问题