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 (或 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和 a传递FieldC给构造函数,而构造函数又会尝试将它们转换为智能指针。因此,您将有 2 个不同的智能指针引用相同的对象。

于 2012-04-24T10:58:44.030 回答