在我的其中一個項目中,我有一些類表示一旦創建就無法更改的實體,也就是說。不可變類。C++中不可變的類
示例:類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;
};
所以,你只能得到一個指針(當然,一個智能指針)一個const RSAKey。對我來說,這是有道理的,因爲對實例的非const引用是無用的(它只有const方法)。
你們看到關於這種模式的任何問題嗎?在C++中是不可變的類是常見的還是我創建了一個怪物?
謝謝您的建議!
一個建議:如果你的類是不可複製和不可變的,那麼你可以使'm_member'爲const。 – 2010-04-16 06:58:42
謝謝。它在我的代碼中是const的。我寫這個例子時我忘了它。編輯;) – ereOn 2010-04-16 07:02:30
使用'boost :: shared_ptr'時不要使用相同的'RSAKey *'構造多個共享指針時要小心,否則它們將不會共享對象的所有權,仍然有引用它的共享指針。因爲這個原因,我實際上不鼓勵使用'boost :: shared_ptr',除非你真的知道你在做什麼,並且使用一個共享指針類來存儲對象內部的引用計數器(例如Qt或自己創建)。 – HelloGoodbye 2015-09-15 17:24:21