C++中的不可变类

ere*_*eOn 6 c++ boost design-patterns class immutability

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

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

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

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

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;
};
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的建议!

Mic*_*Ulm 9

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

  • 提升:noncopyable更明确.查看界面,您将立即看到":public boost :: noncopyable",而您可能不会注意到私有拷贝构造函数和赋值运算符. (5认同)
  • 我不同意(对于矫枉过正的部分,我不会进入boost :: noncopyable讨论):即使只有const方法/成员保证对象不会被更改,返回const指针使其更易于阅读读者.我不需要知道该类是否是不可变的:我不能改变它,因为我被赋予了指向const的指针. (5认同)
  • @DannyT:大声笑,我的意思相反,但我可以看到你如何解释它.实际上,我真的打算创建一个noncopyable,这样你的类就可以继承它,就像boost对你一样. (2认同)

Pot*_*ter 1

在我看来很好。

const标记工厂中的每个对象可以避免标记每个数据成员const,但在本示例中无论如何都只有一个。