2012-05-04 147 views
0

我有一個以int int實現的二維int數組數組。我實現了一個存取功能,這個二維數組如下,返回一個const int的**,以防止用戶能夠編輯:從int **到const int的轉換無效**

const int** Class::Access() const 
{ 
    return pp_array; 
} 

但我得到的編譯錯誤「從int **到無效的轉換const int **「。爲什麼在這裏不允許升級到const?我怎樣才能讓用戶訪問沒有編輯權限的信息?

+1

注意:您的變量名稱不能以數字開頭。 – chris

+0

沒錯,它實際上並沒有在代碼中,這只是我忽略了名稱的疏忽 - 現在編輯出來:) –

+0

封裝1D向量的Matrix類對於保存數據也非常有效。比2D指針數組好得多。它也消除了這樣的混淆。 – chris

回答

4

我誤解了錯誤原因的方法const。正如Ben指出的那樣,該方法的const度是不重要的,因爲它僅適用於外部指針的值[指向int s],可以將其複製到可變的版本。

爲了保護數據(這是你首選的結果),你應該讓這兩個int S和指針int常數:

int const * const * Class::Access() const 
{ 
    return pp_array; 
} 

會工作。

如果你喜歡在前面的常量,你也可以寫像這樣的聲明:

const int * const * Class::Access() const; 

,但由於第二const適用於指針,它必須被放置到右側(如const這適用於該方法)的星號。

+0

爲什麼const之前從int中刪除?這裏指的數據是否仍然不變? –

+1

@BugalugsNash,從右到左閱讀。 int仍然是const。但是,如果const的左邊沒有任何內容,則它適用於右邊。 – chris

+0

const之前/之後int是相同的。它改變了相對於'*'符號的位移時的含義 –

5

Greyson是正確的,你會想要使用const int* const*,但沒有解釋爲什麼你的原始版本失敗。

這裏是示範爲什麼int**const int**不兼容:

const int ci = 0; 
const int* pci = &ci; 
int* pi; 
int** ppi = π 
const int** ppci = ppi; // this line is the lynchpin 
*ppci = pci; 
*pi = 1; // modifies ci! 
+0

雖然這是正確的,但它並沒有解決在這種情況下int **需要爲const的原因;該方法的'常量'是爲什麼返回可變指針指向int的關鍵。 – Greyson

+0

那裏,現在呢:) – Greyson

+0

@Greyson:方法的const屬性沒有區別,沒有人寫'pp_array = anything'。我剛剛添加的新措辭解釋了爲什麼你的推理完全錯誤。 –