ضع ثابتًا لإيقاف تحرير بيانات المؤشر مع تعزيز Share_ptr

StackOverflow https://stackoverflow.com//questions/24050425

  •  21-12-2019
  •  | 
  •  

سؤال

لذا تخبرني ويكيبيديا (بشكل صحيح على ما أعتقد) أنه لإيقاف تحرير بيانات المؤشر والمؤشر نفسه، يجب علي القيام بذلك:

void function(int const * const var)

هل هذه هي نفس هذه الوظيفة:

void function(const int * const var)

وفي هذه الحالة لماذا يسمح بذلك؟لأنني أعلم أنه لا يمكنك القيام بذلك بسبب خطأ مكرر في الترجمة:

void function(const int const * const var)

أريد بشكل أساسي أن أفعل الشيء نفسه باستخدام مؤشر التعزيز.هل سأفعل هذا:

void function(const boost::shared_ptr<int> const var)

وكيف سيؤثر ذلك على قدرتي على تكرار مؤشر مشترك للمتجه؟هل يمكنني أن أفعل هذا مع ذلك الحارس:

void function(const boost::shared_ptr<std::vector<int>> const var)
{
    for (unsigned int i = 0; i < var->size(); ++i)
    {
        std::cout << var[i];
    }
}

إضافة:بعد إجابة براين

لذلك إذا قمت بإنشاء مؤشر مثل هذا:

boost::shared_ptr<vector<int>> lala

وأنا أستخدمها في هذه الوظيفة:

function (const boost::shared_ptr<std::vector<const int>> var)

هل سيصلح هذا؟

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

المحلول

نعم، int const * const var بالضبط مثل const int * const var.يمكنك وضع const قبل أو بعد النوع الذي يعدله، "لأسباب تاريخية".يرى http://www.stroustrup.com/bs_faq2.html#constplacement

بالنسبة لكائن المؤشر الذكي، لا يمكنك فعل ذلك بالفعل

const boost::shared_ptr<int> const

لأن كلاهما constتعديل نفس النوع.بدلا من ذلك، تريد

const boost::shared_ptr<const int>

الأول const يمنع تعديل المؤشر نفسه (أي., ، إعادة تعيينها للإشارة إلى آخر int) و ال const في معلمة القالب تخبر الكائن operator* للعودة أ const int&, ، مما يمنع التعديل int وأشار إلى.

هذا لا يمنع التكرار على ناقل أو حاوية أخرى بالطريقة التي وصفتها، لنفس السبب الذي يجعلك لا تزال قادرًا على التكرار على const ناقلات بشكل طبيعي.

تحرير ردا على تحرير السؤال:

هذا يعمل:

void f(const boost::shared_ptr<const std::vector<int> > var);
// ...
boost::shared_ptr<vector<int> > lala;
f(lala);

الأول const في المعلمة لا يؤثر على تمرير المعلمة على الإطلاق؛فهو يخبر الوظيفة نفسها فقط بعدم تعديل المعلمة.السبب وراء إمكانية إضافة أ const في معلمة القالب هو أن أ boost::shared_ptr<T> يمكن تهيئة من boost:shared_ptr<U> أين T و U ليست بالضرورة نفس النوع، طالما U* قابل للتحويل ضمنيًا إلى T*.لو T بالضبط مثل U إلا مع مؤهل سيرة ذاتية أكبر، كما هو الحال في هذه الحالة، يكون التحويل ممكنًا.

لا تفعل std::vector<const int>.أنا متأكد إلى حد ما أن هذا غير قانوني.(على الأقل ظهرت لي شاشات متعددة لأخطاء الترجمة في كل مرة جربتها.)

نصائح أخرى

const قبل أو بعد int هو نفسه:

giveacodicetagpre.

و

giveacodicetagpre.

هي نفسها وتعني القيمة المدببة لا يمكن تغييرها

const بعد * يعني عدم إعادة تعيين المؤشر.

إذا فهمت بشكل صحيح، كنت ترغب في جعل ناقلات const.إذا كان هذا هو الحال، فسيكون بناء الجملة هذا:

giveacodicetagpre.

يتم تمرير المؤشر الذكي عن طريق الرجوع إلى المرجع لأنه أرخص من اجتياز المؤشر الذكي حسب القيمة ولديه نفس التأثير.الكائن المشار إليه من قبل المؤشر الذكي غير قابل للتغيير عن طريق الإعلان عن النوع الذي يشير إليه كما const.

لقد استنتجت ذلك بشكل صحيح const shared_ptr<Foo> لا يجعل Foo كائنًا ثابتًا.تم وصف هذه "الثغرة" في ويكيبيديا.بدلاً من ذلك، تحتاج إلى تغيير نوع المؤشر المخزن بواسطة Boost::shared_ptr.يمكن القيام بذلك في وسيطة القالب نفسها:

void function(const boost::shared_ptr<const std::vector<int>>& var)

يحتوي Boost::shared_ptr على مُنشئ نسخ يسمح بنسخ نوع ثابت من نوع غير ثابت.ولا ينبغي أن يكون العكس ممكنا.

قبل او بعد؟

السطران أدناه متكافئان لغويًا، وكلاهما يعلن عن مؤشر لا يمكن تغيير قيمته، ويشير إلى int لا يمكن تغييره.

int const * const p1 = ...; 
const int * const p2 = ...;

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


الاكثر const, ، الافضل؟

 typedef boost::shared_ptr<int> shared_int_ptr;

 const shared_int_ptr const p3; // ill-formed

ما سبق typedef يتم توفيرها لتسهيل رؤية ذلك boost::shared_ptr<int> هو اسم واحد، وبالتالي لا يمكننا أن نضيف const على كلا الجانبين؛ينسخ الثوابت هي (كما ذكرت) ليست قانونية C++.

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


سابقا كتبنا ذلك boost::shared_ptr يجب أن يلتف حول int, ولكن بما أننا نريد أن نصنع النوع المغلف const, ، حسنًا..دعونا التفاف Shared_ptr حول ما نريد:

void func (const boost::shared_ptr<const int> foo);

في ما سبق func غير قادر على التعديل foo, ، ولا int المشار إليها من قبل foo.

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