1

int**として実装されたintの2D配列を持つクラスがあります。この2D配列にアクセサ関数を次のように実装し、const int **を返して、ユーザーが編集できないようにしました。

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

しかし、コンパイルエラー「int**からconstint**への無効な変換」が発生しました。constへの昇格がここで許可されていないのはなぜですか?編集権なしでユーザーに情報へのアクセスを許可するにはどうすればよいですか?

4

2 に答える 2

6

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!
于 2012-05-04T03:59:37.077 に答える
4

constエラーの理由がメソッドの性質であると誤解していました。Ben が指摘するようにconst、メソッドの -ness は無関係です。なぜなら、それは [ ints へのポインターへの] 外部ポインターの値にのみ適用され、変更可能なバージョンに自明にコピーできるからです。

データを保護するには (これが望ましい結果です)、ints と s へのポインターの両方をint定数にする必要があります。

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

動作します。

前に const を置きたい場合は、次のように宣言を書くこともできます。

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

ただし、2 番目はポインターに適用されるため、アスタリスクconstの右側 (メソッドに適用される のように) に配置する必要があります。const

于 2012-05-04T03:49:41.297 に答える