سؤال
إذا كان لدي 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 عندما يذهب الدرجة خارج النطاق.