在我的一个项目中,我有一些类代表一旦创建就无法改变的实体,也就是说。不可变的类。
示例:表示仅具有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 ++中是常见的,还是我刚创建了一个怪物?
感谢您的建议!
答案 0 :(得分:9)
这看起来有点矫枉过正。当您只有const成员时,无论如何都无法更改对象。如果要禁止复制,只需将复制构造函数和赋值运算符设为私有。
答案 1 :(得分:1)
对我来说很好。
标记工厂中的每个对象const
会避免标记每个数据成员const
,但在此示例中只有一个。