كيف يمكنني اجراء الإشارة في دفعة :: shared_ptr باستخدام دفعة :: ربط دون تعريف وظيفة واضحة؟

StackOverflow https://stackoverflow.com/questions/2453048

  •  20-09-2019
  •  | 
  •  

سؤال

وأريد أن الإشارة إلى عقد الكائن بحيث لا يحصل المحذوفة في وظيفة ربط، ولكن من دون استخدام وظيفة المساعد.

struct Int
{
   int *_int;
   ~Int(){ delete _int; }
};

void holdReference(boost::shared_ptr<Int>, int*) {} // helper

boost::shared_ptr<int> fun()
{
   boost::shared_ptr<Int> a ( new Int ); 
   // I get 'a' from some please else, and want to convert it
   a->_int = new int;

   return boost::shared<int>( a->_int, boost::bind(&holdReference, a, _1) );

}

هل هناك طريقة لاعلان وظيفة holdReference في المكان؟ كما هو الحال مع تعبيرات لامدا أو لك شيء؟ (دون استخدام هذه الوظيفة holdReference سيئة، والتي يجب أن تكون أعلن خارج نطاق الوظيفة متعة) كان لي عدة محاولات ولكن غير منهم المترجمة:)

وطيب، هنا هو مثال أكثر تفصيلا:

#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>

// the case looks more or less like this
// this class is in some dll an I don't want to use this class all over my project
// and also avoid coppying the buffer
class String_that_I_dont_have 
{
    char * _data; // this is initialized in 3rd party, and released by their shared pointer

public:
    char * data() { return _data; }
};


// this function I created just to hold reference to String_that_I_dont_have class 
// so it doesn't get deleted, I want to get rid of this
void holdReferenceTo3rdPartyStringSharedPtr( boost::shared_ptr<String_that_I_dont_have>, char *) {}


// so I want to use shared pointer to char which I use quite often 
boost::shared_ptr<char> convert_function( boost::shared_ptr<String_that_I_dont_have> other) 
// 3rd party is using their own shared pointers, 
// not the boost's ones, but for the sake of the example ...
{
    return boost::shared_ptr<char>( 
        other->data(), 
        boost::bind(
            /* some in place here instead of holdReference... */
            &holdReferenceTo3rdPartyStringSharedPtr   , 
            other, 
            _1
        )
    );
}

int main(int, char*[]) { /* it compiles now */ }

// I'm just looking for more elegant solution, for declaring the function in place
هل كانت مفيدة؟

المحلول

ويمكنك أن تبحث عن المنشئ "الملكية المشتركة"، وهذا يسمح عد المرجع مؤشر الداخلية.

struct Int
{
   int *_int;
   ~Int(){ delete _int; }
};

boost::shared_ptr<int> fun()
{
   boost::shared_ptr<Int> a (new Int);
   a->_int = new int;

   // refcount on the 'a' instance but expose the interior _int pointer
   return boost::shared_ptr<int>(a, a->_int);
}

نصائح أخرى

وأنا قليلا الخلط من جانب ما تحاول القيام به هنا.

هل المتعة () من المفترض أن boost::shared_ptr<int> العودة أو boost::shared_ptr<Int> ؟؟؟

وأنا لا أعتقد أنك تريد إنشاء shared_ptr<int> هذا هو مؤشر مشترك حول مؤشر الخام التي تملكها مباشرة من قبل الكائن كثافة العمليات، ككائن كثافة العمليات سوف تحذف _int كلما كان يخرج من نطاق (على الرغم من في المثال لم يفعل ذلك 'الجديدة' ذلك!).

وتحتاج إلى الخروج مع ملكية واضح / نموذج المسؤولية.

وربما كنت يمكن أن توفر مختلف، أكثر واقعية، مثال على ما تحاول تحقيقه؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top