2012-04-24 180 views
3

大家好我目前使用QuickFast庫,我使用boost智能指針看到這個聲明:如何使用智能指針實例化一個對象

namespace QuickFAST{ 
namespace Messages{ 
    class FieldIdentity; 
    typedef boost::intrusive_ptr<const FieldIdentity> FieldIdentityCPtr; 
    typedef boost::intrusive_ptr<FieldIdentity> FieldIdentityPtr; 

    void QuickFAST_Export intrusive_ptr_add_ref(const FieldIdentity * ptr); 
    void QuickFAST_Export intrusive_ptr_release(const FieldIdentity * ptr); 
    void QuickFAST_Export intrusive_ptr_add_ref(FieldIdentity * ptr); 
    void QuickFAST_Export intrusive_ptr_release(FieldIdentity * ptr); 

    } 
} 

,我得到了另一個類,我需要實例, 這是類:

namespace QuickFAST{ 
namespace Messages{ 
    /// @brief the representation of a field within a message. 
    class QuickFAST_Export MessageField 
    { 
    public: 
    /// @brief Construct from an identity and a typed value. 
     MessageField(const FieldIdentityCPtr & identity, const FieldCPtr & field) 
      : identity_(identity) 
      , field_(field) 
      { 
      } 

    private: 
     FieldIdentityCPtr identity_; 
     FieldCPtr field_; 
    }; 
    } 
} 

所以我的問題是:當我需要創建一個MessageField,我需要先準備我的FieldIdentityCPtr(RESP FieldCPtr),但它是一個推動智能指針,所以糾正我,如果我錯了,但我想也許我可以這樣做:

FieldIdentityCPtr identityFF_= new FieldIdentity(nameFld,,idFld); 
FieldCPtr fieldFF_ = new Field(typeFld,false); 
MessageField(*identityFF_,*fieldFF_); 

回答

1

沒有,應該是MessageField(identityFF_,fieldFF_);

當您取消引用智能指針時,您將取回原始對象。所以,如果你做MessageField(*identityFF_,*fieldFF_);,你基本上將FieldIdentityCFieldC傳遞給構造函數,而構造函數又會嘗試將它們轉換爲智能指針。所以你會有2個不同的智能指針引用相同的對象。

+1

難道不會傳遞'FieldIdentity&'和'Field&'嗎? – 2012-04-24 11:05:46

+0

@MatthieuM。看着文檔,我認爲你是對的。但我仍然認爲這種做法是不正確的。如果構造函數使用兩個智能指針作爲參數,那麼爲什麼不只提供構造函數和引用它們呢? – 2012-04-24 11:12:03

+0

哦,絕對是我在表格上挑逗,絕對不是內容。 – 2012-04-24 11:12:56