C ++中的不可变类

时间:2010-04-16 06:55:13

标签: c++ design-patterns class boost immutability

在我的一个项目中,我有一些类代表一旦创建就无法改变的实体,也就是说。不可变的类。

示例:表示仅具有const方法的RSA密钥的类RSAKey。没有必要更改现有实例:如果您需要另一个实例,则只需创建一个实例。

我的对象有时很重,我强制使用智能指针来避免深度复制。

到目前为止,我的课程有以下模式:

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;
};

所以你只能得到一个指针(好吧,一个智能指针)到一个const RSAKey。对我来说,这是有道理的,因为对实例的非const引用是无用的(它只有const方法)。

你们看到有关这种模式的任何问题吗?不可变类在C ++中是常见的,还是我刚创建了一个怪物?

感谢您的建议!

2 个答案:

答案 0 :(得分:9)

这看起来有点矫枉过正。当您只有const成员时,无论如何都无法更改对象。如果要禁止复制,只需将复制构造函数和赋值运算符设为私有。

答案 1 :(得分:1)

对我来说很好。

标记工厂中的每个对象const会避免标记每个数据成员const,但在此示例中只有一个。