Const-функции и интерфейсы в C ++ - PullRequest
3 голосов
/ 19 мая 2010

Я буду использовать следующий (тривиальный) интерфейс в качестве примера:

struct IObject
{
  virtual ~IObject() {}

  virtual std::string GetName() const = 0;
  virtual void ChangeState() = 0;
};

Логика диктует, что GetName должна быть const функцией-членом, тогда как ChangeState не должна.

Однако весь код, который я видел до сих пор, не следует этой логике. То есть GetName в приведенном выше примере не будет помечено как const функция-член.

Это лень / небрежность или есть законная причина для этого? Каковы основные недостатки, которые я заставляю своих клиентов реализовывать const функции-члены, когда они логически вызываются?


РЕДАКТИРОВАТЬ: Спасибо за ваши ответы всем. Я думаю, что это в значительной степени единодушно: лень / невежество - причина того, что я вижу.

Ответы [ 2 ]

9 голосов
/ 19 мая 2010

Я думаю, что это лень / беспечность. GetName() не должно влиять на состояние объекта, и контракт IObject должен явно указывать этот факт.

Если наследующий класс каким-то образом заставил GetName() иметь (скрытые!) Побочные эффекты, они всегда могли бы объявить соответствующие поля как mutable.

5 голосов
/ 19 мая 2010

Это лень / неосторожность или есть законная причина для этого?

бывший. Если вы действительно не видели ни одного кода, который делает это правильно, немедленно получите новую работу .

Каковы основные минусы, заставляющие моих клиентов реализовывать const функции-члены, когда они логически вызываются?

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


Более десяти лет назад, вскоре после того, как я присоединился к новой компании и приступил к взлому одного из их проектов, я обнаружил, что метод, который должен был быть const, не мешал некоторым моим const - правильный код для компиляции. Я подумал о том, чтобы просто выбросить const и продолжить, но я не мог заставить себя сделать это.
Поэтому я сделал метод const - просто чтобы обнаружить, что он вызывает другие методы, которые тоже должны были быть константными, но не такими. Так что я их тоже изменил - просто чтобы обнаружить ...
В итоге я потратил несколько дней на охоту по всему проекту, добавив const влево и вправо.
Сотрудники смеялись надо мной - пока я не показал им некоторые ошибки, обнаруженные компилятором из-за того, что я добавил const. Интересно, что несколько давних ошибок, которые никто никогда не уделял времени для тщательного расследования, также не воспроизводились после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...