En C++, ¿es un método const devolver un puntero a un objeto no const considerado mala práctica? Por ejemplo. considerar los siguientes métodos:En C++, ¿es un método const devolver un puntero a un objeto no const considerado mala práctica?
// Makes perfect sense
bool isActive() const { return m_isActive; }
// Makes perfect sense, both consts ensure nothing is modified
const SomeObject* someObject() const { return m_someObject; }
// Makes perfect sense, no const because SomeObject is mutable,
// thus MyClass is indirectly mutable
SomeObject* someObject() { return m_someObject; }
// Makes no sense, if you're just returning a pointer to a const object,
// then the method should clearly be const since nothing can be modified
const SomeObject* someObject() { return m_someObject; }
La última combinación me intriga: ¿La siguiente considera una mala práctica?
SomeObject* someObject() const { return m_someObject; }
Debido a que la clase que método devuelve no es constante, pero el método es, es algo inútil, ya que podría modificar SomeObject
y por lo tanto indirectamente modificar su clase ... así que se forma considera una mala práctica? p.ej. ¿Deberías usar solo uno de los siguientes en lugar de él?
const SomeObject* someObject() const { return m_someObject; }
SomeObject* someObject() { return m_someObject; }
situación del mundo real: Estoy escribiendo un juego de teléfono inteligente que tiene una clase Game
. La clase Game
contiene varios métodos que devuelven punteros a clases de utilidad como InputManager
, AudioManager
, etc.
class Game
{
public:
InputManager* inputManager() const { return m_inputManager; }
...
private:
InputManager* m_inputManager;
...
}
¿tiene algún sentido en absoluto para hacer inputManager()
const, ya que el objeto se vuelve no es? (Y no debe ser, ya que las necesidades InputManager
ser mutable por su estado para ser actualizado, etc.)
O debería eliminar el modificador del método const
para reflejar con más precisión el comportamiento del método? De esa manera, si tuviera un const Game
, no podría llamar al inputManager()
y luego meterme con el administrador de entrada Game
aunque el Game
fuera const
.
Si el objeto A "posee" el objeto B, y desea tratar a A como const, entonces un acceso a B también debería ser const. Si A no posee B, entonces todas las apuestas están desactivadas. Como señala OP, es un problema de estilo en C++. Un lenguaje más pedante haría cumplir esto. –