вернуть константное и неконстантное значение из метода получения

0

Я задал здесь один вопрос, который не получил желаемого ответа, я все еще размышляю над этой темой, поэтому начните этот новый вопрос, надеюсь, я могу описать мое удивление лучше.

У меня такой код:

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++ не хватает какой-либо конструкции на уровне языка.

Теги:

1 ответ

2
Лучший ответ

Ты почти понял это.

struct A
{
  P* get_p();
  const P* get_p() const;
};

Это перегружает get_p зависимости от того, является ли A const или нет. Если A является константой, то вызывающий, который получает прямой доступ к указателю, не может его изменить. Версия non-const не изменяет непосредственно A, но позволяет вызывающему пользователю сделать это с помощью возвращаемого указателя.

Это обычная модель в библиотеках, у которых есть прямые аксессоры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню