2016-02-28 74 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

相關問題