سؤال

أنا بدأت للتو مع C++ و حصلت بعض المشاكل في فهم كيف نطاق خاص المتغيرات عضو في فئة الأعمال.الرجاء راجع أدناه رمز

class Foo{
    private:
        std::vector<int> container;
    public:
        // other methods
};

int main(int argc, char* argv[])
{
    Foo* foo = new Foo;
    // other method calls to which foo is passed
    delete foo;
    return 0;
}

في التعليمات البرمجية أعلاه متغير "حاوية" هو عضو متغير.أنا الاحتجاج "فو" المثال وتمريرها إلى عدة طرق أخرى و الطبقات.التالية هي شكوكي

  1. ماذا سيكون نطاق متغير "الحاوية"?هذا المتغير موجود حتى يمكنني حذف سبيل المثال فو?
  2. هل أنا بحاجة إلى جعل "الحاوية" مؤشر إلى ناقل?

شكرا للمساعدة

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

المحلول

  1. نعم ، عمر الحاوية الأعضاء سوف تستمر طالما الكائن الذي يحتوي على أنه موجود ، والتي يتم حتى استدعاء delete على مؤشر يشير إلى ذلك (foo في هذه الحالة).
  2. لا يوجد أي سبب للقيام بذلك.مما يجعل مؤشر يتطلب منك إنشاء كائن ديناميكي من vector<int> والتي سوف تحتاج إلى إدارة عمر (بما في ذلك الدعوة حذف في حاوية المؤشر).التي لا لزوم لها هنا.على افتراض انك تريد وعاء آخر طالما فو كائن كنت على ما يرام مع وجود ذلك مباشرة الواردة ، دون أن تفعل ذلك مع المؤشر.

ويمر foo مؤشر فقط تمرير المؤشر.الكائن الذي يشير إلى سوف لا يتم نسخ, فقط مؤشر لافتا إلى أنه إذا ضروري.إذا كنت تعرف جافا ، ثم فإنه يساعدك إذا قلت لك تمرير المؤشر هو نفسه مجرد مرور إشارة إلى كائن في جافا, يقول:

Foo f = new Foo();
// just passes the reference (pointer in C++) to doIt. 
// the actual object is not copied
doIt(f);

نصائح أخرى

أنا الاحتجاج "فو" على سبيل المثال

في الواقع, يتم إنشاء مثيل فئة فو.

على وجه التحديد ، يتم تخصيص كتلة من الذاكرة خارج كومة عبر الجديدة().هذه الكتلة من الذاكرة هو كبير بما فيه الكفاية لاحتواء فو::حاوية ومهما أخرى فوق الطبقة فو يتطلب.

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

وبطبيعة الحال ، الجديدة() استدعاء (ربما الافتراضي؟) فو::فو() منشئ, والذي بدوره تهيئة فو::حاوية من خلال الأمراض المنقولة جنسيا::ناقلات منشئ.

ماذا سيكون نطاق متغير "الحاوية"?

حاوية هو سمة [المكونات] مثيل فو.كان موجودا طالما سبيل المثال فو موجود.

نطاق الحكمة ، يمكننا الحديث عن فو::حاوية.ولكن لا يمكنك الوصول إلى فو::constainer دون مثيل من فئة فو.(E. g.الكائن فو.) فو::constainer لا توجد بدون مثيل من فئة فو.

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

هذا النطاق هو ذات صلة إلى العام/حماية/خاص/صديق الأعضاء-التحكم في الوصول.

E. g. ، في بعض فو::myPublicMethod() يمكنك الرجوع إلى فو::حاوية.على الرغم من أنك يمكن أيضا التخلي عن صريح النطاق في هذه الحالة فقط تشير إلى أنها حاوية.

العقل خاصة ، فو::حاوية خارج الصف فوو الأساليب.

هذا المتغير موجود حتى يمكنني حذف سبيل المثال فو?

نعم.

هل أنا بحاجة إلى جعل "الحاوية" مؤشر إلى ناقل?

لا.يمكنك, ولكن أنت بالتأكيد لم يكن لديك إلى.

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


اعتمادا على الاحتياجات الخاصة بك ، قد تنظر في:

int main(int argc, char* argv[])
{
  Foo foo;
  // other method calls to which foo is passed
  return 0;
}

فو سوف تخرج من نطاق بعد return 0;, و يتم حذفها تلقائيا.وعلاوة على ذلك ، فو سيخصص خارج المكدس بدلا من كومة.


قد تجد نسخة مستعملة من المشروح C++ الدليل المرجعي مفيدا.انه قديم ولكن تم الإشارة إلى نسبة الضوضاء.

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