3

こんにちは、私は現在 QuickFast ライブラリを使用しています。ブースト スマート ポインターを使用したこの宣言を見ました。

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_);
4

1 に答える 1

1

いいえ、そのはずですMessageField(identityFF_,fieldFF_);

スマート ポインターを逆参照すると、元のオブジェクトが返されます。したがって、MessageField(*identityFF_,*fieldFF_);基本的に aFieldIdentityCと aFieldCをコンストラクターに渡し、コンストラクターはそれらをスマートポインターに変換しようとします。したがって、同じオブジェクトを参照する 2 つの異なるスマート ポインターができます。

于 2012-04-24T10:58:44.030 に答える