我有一個以int int實現的二維int數組數組。我實現了一個存取功能,這個二維數組如下,返回一個const int的**,以防止用戶能夠編輯:從int **到const int的轉換無效**
const int** Class::Access() const
{
return pp_array;
}
但我得到的編譯錯誤「從int **到無效的轉換const int **「。爲什麼在這裏不允許升級到const?我怎樣才能讓用戶訪問沒有編輯權限的信息?
我有一個以int int實現的二維int數組數組。我實現了一個存取功能,這個二維數組如下,返回一個const int的**,以防止用戶能夠編輯:從int **到const int的轉換無效**
const int** Class::Access() const
{
return pp_array;
}
但我得到的編譯錯誤「從int **到無效的轉換const int **「。爲什麼在這裏不允許升級到const?我怎樣才能讓用戶訪問沒有編輯權限的信息?
我誤解了錯誤原因的方法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
這適用於該方法)的星號。
爲什麼const之前從int中刪除?這裏指的數據是否仍然不變? –
@BugalugsNash,從右到左閱讀。 int仍然是const。但是,如果const的左邊沒有任何內容,則它適用於右邊。 – chris
const之前/之後int是相同的。它改變了相對於'*'符號的位移時的含義 –
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!
注意:您的變量名稱不能以數字開頭。 – chris
沒錯,它實際上並沒有在代碼中,這只是我忽略了名稱的疏忽 - 現在編輯出來:) –
封裝1D向量的Matrix類對於保存數據也非常有效。比2D指針數組好得多。它也消除了這樣的混淆。 – chris