سؤال

إذا كان لدي auto_ptr يمكن تمرير التصفح.مثل:

auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)

وما هو الغريب نسخ سلوك auto_ptrs?

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

المحلول

لا لا يمكنك أن إلغاء مرجعية ذلك:

SetOponent( * Class )

أما بالنسبة نسخ السلوك أنصحك بقراءة كتاب جيد في C++ ، مثل فعالية C++ سكوت مايرز.نسخ سلوك auto_ptr للغاية الأمم المتحدة بديهية وربما خارج نطاق حتى الإجابة.ومع ذلك ، لا شيء غامر...

عندما auto_ptr نسخ ، تم نقل ملكية الأصل إلى نسخة.على سبيل المثال:

auto_ptr <Foo> p1( new Foo ); 

عند هذه النقطة p1 يملك مؤشر فو الكائن.

auto_ptr <Foo> p2( p1 ); 

بعد نسخ, p2 يملك المؤشر ، p1 تغيير حتى الآن يحمل مؤشر فارغة.هذا هو المهم, لأن النسخ يحدث في الكثير من الأماكن في C++.يجب عليك أبدا ، على سبيل المثال ، تمريرة auto_ptrs من قيمة الوظائف ، أو محاولة تخزينها في المكتبة القياسية الحاويات.

نصائح أخرى

والسلوك نسخة الغريب هو أنه لا يمكنك عمل نسخة والتي لا تزال الأصلي. استخدام shared_ptr (في دفعة :: أو الأمراض المنقولة جنسيا :: TR1: :) لذلك. هذا يعني أنك لا يمكن أن يكون وعاء STL من auto_ptrs، من بين أمور أخرى. auto_ptr<> أمر مفيد جدا لأنه عندما سيكون لديك نسخة واحدة من كائن، مع عمر محدود. إذا قمت بنسخ إلى auto_ptr<> آخر، تفقد أولا. إذا كنت تمر بها مؤشرات، لديك فرصة ممتازة لمحاولة استخدام كائن بالفعل تم حذفه.

ويمكنك الاتصال SetOponent(*Class); إذا أردت، والتي من شأنها تمرير هذا البند الفعلية (التي تمرر الأشياء، لا مؤشرات، إلى المراجع). إذا قمت بتمرير إلى مؤشر، يمكن أن تسميه مع SetOpponent(Class.get()). عليك لا تزال لديها مشكلة التي سيتم حذف MyClass عندما يذهب الدرجة خارج النطاق.

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