В одном из моих проектов у меня есть несколько классов, которые представляют собой объекты, которые не могут измениться после создания, ака. неизменяемые классы.Неизменяемые классы в C++
Пример: класс RSAKey
, представляющий ключ RSA, который имеет только методы const. Нет смысла менять существующий экземпляр: если вам нужен другой, вы просто создаете его.
Мои объекты иногда тяжелые, и я применял использование умных указателей, чтобы избежать deep копия.
До сих пор, у меня есть следующий образец для моих классов:
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;
};
Таким образом, вы можете получить только указатель (ну, указатель умного) к константной RSAKey. Для меня это имеет смысл, потому что наличие неконстантной ссылки на экземпляр бесполезно (оно имеет только методы const).
Вы, ребята, видите какую-либо проблему в отношении этого шаблона? Являются ли неизменяемые классы чем-то распространенным в C++ или я только что создал монстра?
Благодарим вас за советы!
Одно из предложений: если ваш класс не подлежит копированию и неизменен, вы также можете сделать 'm_member' const. –
Спасибо. Это const в моем коде. Я забыл об этом, когда написал этот пример. Отредактировано;) – ereOn
Просто будьте осторожны при использовании 'boost :: shared_ptr' не для создания более одного общего указателя с использованием того же' RSAKey * ', либо они не будут разделять право собственности на объект друг с другом и будут удалены, если все еще есть общие указатели, ссылающиеся на него. По этой причине я бы действительно препятствовал использованию 'boost :: shared_ptr', если вы действительно не знаете, что вы делаете, и используйте общий класс указателей, который вместо этого хранит контрольный счетчик внутри объектов (например, Qt или создайте свой собственный). – HelloGoodbye