سؤال

ماذا يفعل الناس هنا استخدام C++ مجردة قاعدة فئة الصانعين في الميدان ؟ أنا أتحدث عن محض واجهة الطبقات عدم وجود بيانات أعضاء لا غير نقية الظاهري أعضاء.

يمكن لأي شخص أن تثبت أي التعابير التي تستخدم حروف المنشئات في طريقة مفيدة?أم أنها مجرد جوهري على طبيعة استخدام أبجديات تنفيذ واجهات أن تظل فارغة ، مضمنة محمية ؟

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

المحلول

يمكن لأي شخص أن تثبت أي التعابير التي تستخدم حروف المنشئات في طريقة مفيدة?

وهنا على سبيل المثال ، على الرغم من انها مفتعلة نادرة المثال.

قد استخدامه للحفاظ على قائمة بجميع الحالات:

class IFoo
{
private:
  //static members to keep a list of all constructed instances
  typedef std::set<IFoo*> Set;
  static Set s_set;

protected:
  //new instance being created
  IFoo()
  {
    s_set.insert(this);
  }

public:
  //instance being destroyed
  virtual ~IFoo()
  {
    s_set.remove(this);
  }

  ... plus some other static method and/or property
      which accesses the set of all instances ...
};

أم أنها مجرد جوهري على طبيعة استخدام أبجديات تنفيذ واجهات أن تظل فارغة ، مضمنة محمية ؟

أكثر عادة هم فقط لم تعلن على الإطلاق!ليس هناك سبب أن يعلن لهم:

  • فارغة و inline => لماذا تعلن ذلك ؟
  • المحمية => ABC ربما لديها بالفعل بعض نقية الظاهري أساليب و بالتالي قد لا يمكن إنشاء مثيل إلا فئة فرعية.

نصائح أخرى

لنفترض أن هناك بعض التصرفات التي هي مشتركة لجميع الفئات المشتقة منها. مثل تسجيل نفسها في بعض التسجيل الخارجي، أو التحقق من صحة شيء ما.

ويمكن وضع كل هذا رمز مشترك في منشئ الفئة الأساسية، ووسوف يطلق عليه ضمنيا من منشئات من كل من الفئات المشتقة منها.

وكيف <م> يمكن يمكن استخدام منشئ فئة قاعدة مجردة من أي شيء؟

وافترض أن لديك المجرد الفئة الأساسية B وفئة مشتقة D. عند إنشاء كائن من نوع D، ويسمى منشئ B في البداية، ولكن في تلك المرحلة، وجوه "،" ما زال من نوع B (انظر <ل أ href = "http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.7" يختلط = "نوفولو noreferrer"> هنا ) - على وجه الخصوص، استدعاء أي وظائف افتراضية من فإن الجسم من منشئ B ستدعو تطبيقات <م> B الخاصة من تلك الوظائف. ولكن إذا B هي فئة مجردة صافية، وتعرف أيا من تلك الدالات الظاهرية، وبالتالي فإن البرنامج سوف تعطل فورا.

وأنا أعتقد أنك المعدة للمنشئ B لدعوة وصولا الى (D'الصورة على سبيل المثال) تنفيذ الطبقة الأكثر مشتقة من دالة ظاهري، أليس كذلك؟ ومن شأن ذلك أن يكون فكرة سيئة بشكل عام لأن الكائن D'الصورة لا تبنى بشكل كامل حتى الآن، لذلك أي يصل إلى المتغيرات عضو في D من داخل تنفيذ D'الصورة من الدالة الظاهري أن الوصول إلى ذاكرة uninitialised.

تذكر: "الموارد الاستحواذ هو التهيئة".

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

void PlayWithPaintBallGun(Target &target)
{
    PaintBallGun paintBallGun;    // constructor waits until the gun is free,
                                  // then picks it up.

    paintBallGun.Aim(target);     // Shoot something
    paintBallGun.Fire();          //

                                  // Clever! The destructor is automatically
                                  // called when it goes out of scope. So we
                                  // can't forget to put the gun down.
}

هوغو

وأنا لا أستطيع التفكير في العديد من الأمثلة المفيدة. وهناك فئة دون-أعضاء البيانات أي دولة، وبالتالي لا يمكن تهيئة أي شيء. هل يمكن أن يكون منشئ / المدمر القيام تسجيل لك، وإن كان. على سبيل المثال، لتسجيل خلق / تدمير كافة الكائنات الزوار:

class Visitor {
public:
    Visitor() {
        std::cout << "Visitor@" << this << " created" 
                  << std::endl;
    }

    virtual ~Visitor() {
        std::cout << "Visitor@" << this << " destroyed" 
                  << std::endl;
    }

    virtual void visitA(A*) = 0;
    virtual void visitB(B*) = 0;
    // ...
};

وعادة لها فقط لالتهيئة أعضاء لقيم معقولة.

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