2010-04-16 80 views
6

在我的其中一個項目中,我有一些類表示一旦創建就無法更改的實體,也就是說。不可變類。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++中是不可變的類是常見的還是我創建了一個怪物?

謝謝您的建議!

+1

一個建議:如果你的類是不可複製和不可變的,那麼你可以使'm_member'爲const。 – 2010-04-16 06:58:42

+0

謝謝。它在我的代碼中是const的。我寫這個例子時我忘了它。編輯;) – ereOn 2010-04-16 07:02:30

+0

使用'boost :: shared_ptr'時不要使用相同的'RSAKey *'構造多個共享指針時要小心,否則它們將不會共享對象的所有權,仍然有引用它的共享指針。因爲這個原因,我實際上不鼓勵使用'boost :: shared_ptr',除非你真的知道你在做什麼,並且使用一個共享指針類來存儲對象內部的引用計數器(例如Qt或自己創建)。 – HelloGoodbye 2015-09-15 17:24:21

回答

1

看起來不錯。

在工廠中標記每個對象const可避免標記每個數據成員const,但在本例中只有一個。

+1

@Patatoswatter,你的答案爲什麼是社區維基*? (我甚至不知道自己的答案可能是* community wiki *)。就是想。 – ereOn 2010-04-16 07:40:57

+0

@ereOn:因爲我不覺得我在貢獻什麼。如果有人想在我的文章中添加實際內容,請隨時留言。這更像是一個虛擬的東西,所以你可以接受你最終的正確。 – Potatoswatter 2010-04-16 08:10:19

9

這似乎是矯枉過正。當你只有const成員時,該對象無論如何都不能改變。如果您想禁止複製,只需將複製構造函數和賦值運算符設爲私有。

+0

這已經通過從boost :: noncopyable繼承完成。 – ereOn 2010-04-16 07:16:42

+5

boost:不可複製更明確。看看界面,你會立即看到「:public boost :: noncopyable」,而你可能沒有注意到私有拷貝構造函數和賦值操作符。 – 2010-04-16 07:20:57

+1

但是,當一個完美的成語 - 隱藏複製構造函數和複製賦值運算符 - 已經存在時,會引起Boost的相當大的耦合開銷。程序員的好處是什麼? (Boost的發佈者的好處很明顯) – DannyT 2010-04-16 07:22:29