سؤال

لدي مجمع C ++ / CLI حول ملفات .lib و .h. يمكنني استخدام فئة AutoPTR على نطاق واسع في فئة المجمع لإدارة الكائنات غير المدارة التي أقوم بإنشاء التفاف. لقد وصلت إلى حاجز طريق مع مشغل منشئ / تعيين نسخ.

باستخدام فئة Autoptr من السيد كير: http://weblogs.asp.net/kennykerr/archive/2007/03/26/autoptr.aspx.

يقترح ما يلي (في التعليقات) لإعادة إنشاء سلوك عامل التعيين:

SomeManagedClass->NativePointer.Reset(new NativeType);

التي أعتقد أنها صحيحة. ولكن عندما أرسم رمزي:

ByteMessageWrap (const ByteMessageWrap% rhs)
{
     AutoPtr<ByteMessage> m_NativeByteMessage(rhs.m_NativeByteMessage.GetPointer());
};

ByteMessageWrap% operator=(const ByteMessageWrap% rhs)
{
     //SomeManagedClass->NativePointer.Reset(new NativeType);
     if (this == %rhs) // prevent assignment to self
        return *this;

     this->m_NativeByteMessage.Reset(rhs.m_NativeByteMessage.GetPointer());
     return *this;
};

- أحصل على الأخطاء التالية:

خطأ C2662: "raptest :: autoptr :: GetPointer": لا يمكن تحويل "هذا المؤشر" من "constract raptest :: autoptr" إلى "raptest :: autoptr٪ '

هل شهد أي شخص مشاكل مماثلة؟


لمزيد من الخلفية عن الإجابة، أزلت كلمة "CONS" الرئيسية من التوقيع. أعلم أنه لا يبتسم من حيث صحة التعليمات البرمجية لسعة نسخة واحدة، ولكن CLR لا يحب ذلك على الإطلاق - نوع من يصدق CLR في جوهرها مع إدارة الذاكرة.

أتساءل عما إذا كان من الممكن مغادرة CONST في التوقيع ثم استخدم Gchandle أو pin_ptr للتأكد من أن الذاكرة لا تتحرك إليك أثناء تنفيذ النسخة؟

هل كانت مفيدة؟

المحلول

النظر في AutoPtr في Kenny Kerr's، فإنه ينقل ملكية المنشئه - أساسا منشئ "نقل" بدلا من منشئ نسخة. هذا هو مشابه مع STD :: Auto_Ptr.

إذا كنت ترغب حقا في نقل الملكية من RHS إلى هذا (أي ترك RHS بدونها، فأنت بحاجة إلى تغيير نسختك في المحاسبة إلى طيار خطوة.

أيضا، تحتاج إلى استخدام بناء جملة تهيئة؛

// warning - code below doesn't work
ByteMessageWrap (ByteMessageWrap% rhs)
    : m_NativeByteMessage(rhs.m_NativeByteMessage); // take ownership
{
}

ByteMessageWrap% operator=(ByteMessageWrap% rhs)
{
     //SomeManagedClass->NativePointer.Reset(new NativeType);
     if (this == %rhs) // prevent assignment to self
        return *this;

     m_NativeByteMessage.Reset(rhs.m_NativeByteMessage.Release());
     return *this;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top