سؤال

كيف يمكن للمرء تحويل واحد Shared_PTR يشير إلى كائن CONST إلى Shared_Ptr يشير إلى كائن غير ثابت. أحاول القيام بما يلي:

boost::shared_ptr<const A> Ckk(new A(4));

boost::shared_ptr<A> kk=const_cast< boost::shared_ptr<A> > Ckk;

لكنها لم تعمل.

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

المحلول

سيفعل "Boost :: const_pointer_cast" ما تطلبه، ولكن النصف الثاني الإلزامي من الإجابة هو أنك ربما لا ينبغي استخدامه. 99٪ من الوقت عندما يبدو أنك بحاجة إلى طرح خاصية const the moniable، فهذا يعني أن لديك عيب التصميم. CONST في بعض الأحيان أكثر من مجرد خلع الملابس النافذة والقيام به بعيدا قد يؤدي إلى أخطاء غير متوقعة.

دون معرفة المزيد من التفاصيل حول وضعك، لا يمكن للمرء أن يقول المؤكد. ولكن لا توجد مناقشة من const cast كاملة دون ذكر هذه الحقيقة.

نصائح أخرى

استعمال boost::const_pointer_cast, توثيق.

الطريقة الصحيحة يجب أن يكون هذا

boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));

std::const_cast_pointer يجعل المؤشر المدار الثاني. بعد يلقي لديك مؤشر قاطع و المؤشر الثانوي الأصلي. يبقى المؤشر هو نفسه. تم زيادة عدد المرجع بنسبة 1.

لاحظ أن const_cast هي الكلمة الأساسية المدمجة، ولكن const_pointer_cast هي وظيفة القالب في مساحة الاسم std.

ثم يمكن استخدام المؤشر القابل للكتابة لتغيير القيمة من تحت shared_ptr<const T>. وبعد IMHO يجب أن يستمر المؤشر الكابل فقط مؤقتا على المكدس؛ خلاف ذلك يجب أن يكون هناك عيب التصميم.

كتبت ذات مرة برنامج اختبار صغير لجعل هذا الأمر واضحا لنفسي تكييفه لهذا الموضوع:

#include <memory>
#include <iostream>
#include <cassert>

using namespace std;

typedef shared_ptr<int> int_ptr;
typedef shared_ptr<const int> const_int_ptr;

int main(void)
{
    const_int_ptr Ckk(new int(1));

    assert(Ckk.use_count() == 1);
    cout << "Ckk = " << *Ckk << endl;

    int_ptr kk = const_pointer_cast<int>(Ckk); // obtain a 2nd reference
    *kk = 2;                   // change value under the const pointer

    assert(Ckk.use_count() == 2);
    cout << "Ckk = " << *Ckk << endl;      // prints 3
}

ضمن UNIX أو Windows / Cygwin، ترجمة

g++ -std=c++0x -lm const_pointer_cast.cpp
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top