Неверное преобразование из int** в const int**

У меня есть класс с двумерным массивом целых чисел, реализованных как int **. Я реализовал функцию доступа к этому двумерному массиву следующим образом, возвращая const int **, чтобы предотвратить возможность его редактирования пользователем:

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

Но я получил ошибку компиляции "недопустимое преобразование из int ** в const int**". Почему здесь не разрешено продвижение на const? Как я могу предоставить пользователю доступ к информации без прав редактирования?

2 ответа

Решение

Я ошибся насчет constПричиной ошибки является метод. Как указывает Бен, const-нессность метода не имеет отношения к делу, поскольку она применяется только к значению внешнего указателя [на указатели на ints], который можно легко скопировать в изменяемую версию.

Чтобы защитить данные (что является вашим предпочтительным результатом), вы должны сделать оба intи указатели на intконстанта s:

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

Буду работать.

Если вы предпочитаете иметь const перед собой, вы также можете написать объявление так:

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

но со второго const относится к указателям, он должен быть расположен справа (например, const который относится к методу) звездочки.

Грейсон правильно, что вы хотите использовать 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!
Другие вопросы по тегам