Неизменные классы в C ++ - PullRequest
       15

Неизменные классы в C ++

6 голосов
/ 16 апреля 2010

В одном из моих проектов у меня есть несколько классов, которые представляют сущности, которые нельзя изменить после создания, иначе. неизменяемые классы.

Пример: класс 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 ++ или я только что создал монстра?

Спасибо за советы!

Ответы [ 2 ]

9 голосов
/ 16 апреля 2010

Это похоже на излишество. Когда у вас есть только постоянные члены, объект не может быть изменен в любом случае. Если вы хотите запретить копирование, просто сделайте конструктор копирования и оператор присваивания закрытым.

1 голос
/ 16 апреля 2010

Хорошо выглядит для меня.

Маркировка каждого объекта const с завода исключает маркировку каждого элемента данных const, но в этом примере в любом случае есть только один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...