Я задал здесь один вопрос, который не получил желаемого ответа, я все еще размышляю над этой темой, поэтому начните этот новый вопрос, надеюсь, я могу описать мое удивление лучше.
У меня такой код:
struct A
{
P* get_p() const;
};
void dump_p(const A *a)
{
const P* p = a->get_p();
...... dump out p content for debugging purpose ......
}
void re-format(A *a)
{
P* p = a->get_p();
...... update p content ......
}
Вы можете видеть, что dump_p() действительно является функцией только для чтения, но get_p() возвращает свободный указатель, который позволяет вызывающему абоненту свободно обновлять данные. Это придирается ко мне, я думаю, что компилятор решения может помочь в обеспечении семантической проверки.
Это то, что я придумал:
struct A
{
P* get_p() const;
const P* get_rdonly_p() const;
};
void dump_p(const A *a)
{
const P* p = a->get_rdonly_p();
}
void re-format(A *a)
{
P* p = a->get_p();
}
Добавьте этот get_rdonly_p(), потому что c++ не допускает метод перегрузки только с другим типом возврата.
Я схожу с ума? Или каково ваше решение?
[UPDATE] Спасибо, Адриан, это может быть решением. Но я все еще ударяю головой о стену - неконстантная версия get_p(), которую вы упомянули, не удовлетворяет мне 100%, сама функция не меняет ни одну из структур A, но я не объявляю ее как const, это нытье.
Позвольте мне проверить ваш ответ как можно скорее, возможно, c++ не хватает какой-либо конструкции на уровне языка.
Ты почти понял это.
struct A
{
P* get_p();
const P* get_p() const;
};
Это перегружает get_p
зависимости от того, является ли A
const или нет. Если A
является константой, то вызывающий, который получает прямой доступ к указателю, не может его изменить. Версия non-const не изменяет непосредственно A
, но позволяет вызывающему пользователю сделать это с помощью возвращаемого указателя.
Это обычная модель в библиотеках, у которых есть прямые аксессоры.