سؤال

لدي فصل أرغب في دفعه إلى deque. المشكلة هي عندما أقوم بالتراجع ، أحتاج إلى تغيير الكائن الأصلي وبالتالي أحتاج إلى نسخة غير CONT CTOR. الآن إذا قمت بتطبيق أن Cont Copy CTOR يتم استدعاؤه. إذا قمت بإزالة Const ctor ، فستحصل على خطأ في الترجمة حول عدم وجود ctors المتاح. كيف يمكنني تنفيذ هذا بطريقة يمكنني تعديل البنية الأصلية عندما أمررها؟ أحتاج إلى تعديله قبل الميلاد ، يدمر الفصل الأشياء عندما يخرج من النطاق وأود أن أخبرها بعدم القيام بذلك عندما يكون هناك مثال آخر. لا أستطيع استخدام التعزيز لأن النظام الأساسي الخاص بي لا يدعمه.

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

المحلول

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

الكائن الخاص بك ، ومع ذلك ، يشبه الدلالات البناء. وهذا هو ، بعد الخطوة ، يمتلك الكائن الجديد المورد ، والكائن القديم فارغ. هذا غير مدعوم من قبل Deque اعتبارًا من C ++ 03. هذا هو ، بالمناسبة ، نفس السبب الذي يمنع وضع Auto_ptr في حاوية.

سوف يدعم إصدار C ++ التالي ، الذي يسمى C ++ 0x تلك الدلالات المتحركة عن طريق تقديم مُنشئات نقل خاصة. حتى ذلك الحين ، سيتعين عليك استخدام كائن تشارك الملكية عندما تريد وضعها في حاوية قياسية. هذا يعني أنه إذا قمت بنسخ كائنك ، وخرج الأصل عن النطاق ، لا يتم تحرير المورد المملوك حتى تخرج جميع النسخ عن النطاق. فكر في استخدام Boost :: shared_ptr على سبيل المثال ، أو لفه في فصلك ، إذا كنت لا ترغب في برمجة الفصل الدراسي الخاص بك.

نصائح أخرى

إذا كنت لا تفعل أي شيء مراوغة مع الموارد (انظر تعليقات أخرى) ، فاجعل متغير العضو الذي تريد تغييره متقلب سيسمح لك بتغييره في وظيفة const.

لا يمكنك فعل ما تحاول القيام به. سيكون عليك استخدام المؤشرات ، إما عادي أو ذكي (ولكن ليس Auto_ptr <>). لماذا لا يمكنك استخدام مؤشرات Boost Smart؟ إنها خفيفة الوزن ، ويجب أن تعمل في جميع مجمعي C ++ القياسي بشكل معقول. ليس عليك استخدام كل من التعزيز.

اعتمادًا على ما تحاول القيام به (سيكون المزيد من التفاصيل لطيفة) ، يمكنك إما تعديل الكائن قبل/بعد الاتصال push_back أو اكتب فئة غلاف بسيطة تأخذ مؤشرًا إلى صفك ويمكن إدراجها في deque. يمكن لهذا الكائن بعد ذلك القيام بالشيء المناسب لفصلك على البناء/التدمير/إلخ.

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