Установка const
по результатам методы в хорошо определенной поведения, но он все еще может быть заблуждением поведения. Независимо от того, запутывает ли он или нет, зависит от того, что должен представлять класс и какую ментальную модель должен иметь программист.
Для аналогичного примера рассмотрите std::vector
. Этот класс также имеет элемент данных, который является указателем, и у него есть метод для извлечения этого указателя; например что-то вроде
template< typename T >
class vector
{
T *elements;
public:
T* data() { return elements; }
};
Что относительно версии const
? Ну, то, что экземпляр этого класса представляет, будет изменен, если вы измените то, на что ссылается указатель; т. е. если вы измените элемент вектора, то вы изменили вектор. Следовательно, константная версия не должен возвращать указатель на неконстантный:
template< typename T >
class vector
{
T *elements;
public:
T* data() { return elements; }
const T* data() const { return elements; }
};
С другой стороны, рассмотрит std::shared_ptr
также имеет элемент данных, который является указателем, и есть метод для получения этого указателя:
template< typename T >
class shared_ptr
{
T *ptr;
public:
T* get() { return ptr; }
};
Что делать, если мы получим указатель и изменим то, на что оно указывает? Ну, мы совсем не изменили shared_ptr
: это еще, указывая на этот объект. Поэтому в этом случае мы должны иметь
template< typename T >
class shared_ptr
{
T *ptr;
public:
T* get() const { return ptr; }
};
Это зависит от вашего варианта использования, но в этом случае имеет смысл возвращать 'const Bone *'. –
Это определенно рецепт катастрофы. – user657267
Я хочу иметь возможность изменить ссылочный объект _bone. Я спрашиваю, если это плохая практика, чтобы установить метод как const – Pilpel