Puede que se de el caso de que halles algún error con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes subir el código al trabajo final.
Solución:
El uso de un método getter es una mejor opción de diseño para una clase de larga duración, ya que le permite reemplazar el método getter con algo más complicado en el futuro. Aunque parece menos probable que esto se necesite para un valor constante, el costo es bajo y los posibles beneficios son grandes.
Aparte, en C++, es una idea especialmente buena dar tanto el getter como el setter para un miembro el mismo nombreya que en el futuro puede cambiar el par de métodos:
class Foo
public:
std::string const& name() const; // Getter
void name(std::string const& newName); // Setter
...
;
En una única variable miembro pública que define un operator()()
para cada:
// This class encapsulates a fancier type of name
class fancy_name
public:
// Getter
std::string const& operator()() const
return _compute_fancy_name(); // Does some internal work
// Setter
void operator()(std::string const& newName)
_set_fancy_name(newName); // Does some internal work
...
;
class Foo
public:
fancy_name name;
...
;
Por supuesto, será necesario volver a compilar el código del cliente, ¡pero no se requieren cambios de sintaxis! Obviamente, esta transformación funciona igual de bien para valores constantes, en los que solo se necesita un getter.
Tiende a ser una mala idea hacer públicos los campos que no son constantes porque entonces se vuelve difícil forzar las restricciones de verificación de errores y/o agregar efectos secundarios a los cambios de valor en el futuro.
En su caso, tiene un campo const, por lo que los problemas anteriores no son un problema. La principal desventaja de convertirlo en un campo público es que está bloqueando la implementación subyacente. Por ejemplo, si en el futuro quisiera cambiar la representación interna a una C-string o un Unicode string, o algo más, entonces rompería todo el código del cliente. Con un getter, puede convertir a la representación heredada para los clientes existentes mientras proporciona la funcionalidad más nueva a los nuevos usuarios a través de un nuevo getter.
Todavía sugeriría tener un método getter como el que ha colocado arriba. Esto maximizará su futura flexibilidad.
Aparte, en C++, es algo extraño tener un miembro de referencia const. Tienes que asignarlo en la lista de constructores. ¿Quién posee la memoria real de ese objeto y cuál es su tiempo de vida?
En cuanto al estilo, estoy de acuerdo con los demás en que no quieres exponer tus partes íntimas. 🙂 Me gusta este patrón para setters/getters
class Foo
public:
const string& FirstName() const;
Foo& FirstName(const string& newFirstName);
const string& LastName() const;
Foo& LastName(const string& newLastName);
const string& Title() const;
Foo& Title(const string& newTitle);
;
De esta manera puedes hacer algo como:
Foo f;
f.FirstName("Jim").LastName("Bob").Title("Programmer");