En uno de mis proyectos, tengo algunas clases que representan entidades que no pueden cambiar una vez creadas, también conocido como. clases inmutables.Clases inmutables en C++
Ejemplo: una clase RSAKey
que representa una clave RSA que solo tiene métodos const. No tiene sentido cambiar la instancia existente: si necesita otra, simplemente cree una.
Mis objetos a veces son pesados e impuse el uso de punteros inteligentes para evitar copia profunda.
Hasta ahora, tengo el siguiente patrón para mis clases:
class RSAKey : public boost::noncopyable, public boost::enable_shared_from_this<RSAKey>
{
public:
/**
* \brief Some factory.
* \param member A member value.
* \return An instance.
*/
static boost::shared_ptr<const RSAKey> createFromMember(int member);
/**
* \brief Get a member.
* \return The member.
*/
int getMember() const;
private:
/**
* \brief Constructor.
* \param member A member.
*/
RSAKey(int member);
/**
* \brief Member.
*/
const int m_member;
};
lo que sólo puede obtener un puntero (bueno, un puntero inteligente ) a un RSAKey const. Para mí, tiene sentido, porque tener una referencia no const a la instancia es inútil (solo tiene métodos const).
¿Vieron algún problema con respecto a este patrón? ¿Las clases inmutables son algo común en C++ o acabo de crear un monstruo?
¡Gracias por sus consejos!
Una sugerencia: si su clase no es copiable e inmutable, también puede hacer 'm_member' const. –
Gracias. Es const en mi código. Lo olvidé cuando escribí el ejemplo. Editado;) – ereOn
Solo tenga cuidado cuando use 'boost :: shared_ptr' para no construir más de un puntero compartido usando el mismo' RSAKey * ', o ellos no compartirán la propiedad sobre el objeto entre sí y será eliminado cuando todavía hay punteros compartidos que hacen referencia a él. De hecho, desalentaría el uso de 'boost :: shared_ptr' por esa razón, a menos que realmente sepas lo que haces, y utiliza una clase de punteros compartida que almacena el contador de referencias dentro de los objetos (por ejemplo, Qt's, o crea los tuyos propios). – HelloGoodbye