Неверное преобразование из int** в const int**
У меня есть класс с двумерным массивом целых чисел, реализованных как int **. Я реализовал функцию доступа к этому двумерному массиву следующим образом, возвращая const int **, чтобы предотвратить возможность его редактирования пользователем:
const int** Class::Access() const
{
return pp_array;
}
Но я получил ошибку компиляции "недопустимое преобразование из int ** в const int**". Почему здесь не разрешено продвижение на const? Как я могу предоставить пользователю доступ к информации без прав редактирования?
2 ответа
Я ошибся насчет const
Причиной ошибки является метод. Как указывает Бен, const
-нессность метода не имеет отношения к делу, поскольку она применяется только к значению внешнего указателя [на указатели на int
s], который можно легко скопировать в изменяемую версию.
Чтобы защитить данные (что является вашим предпочтительным результатом), вы должны сделать оба 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!