سؤال

وPimpl هي مصدر متداول في الكثير من التعليمات البرمجية C ++. ويبدو أنهم مثل هذا النوع من الشيء الذي مزيج من وحدات الماكرو، والقوالب، وربما القليل أداة مساعدة خارجية يمكن أن تحل، ولكن لست متأكدا ما أسهل طريقة سيكون. رأيت قوالب التي تساعد تفعل بعض من رفع ولكن ليس كثيرا - كنت لا تزال في نهاية المطاف تحتاج إلى كتابة وظائف الشحن لكل أسلوب من الفئة التي تحاول التفاف. هل هناك طريقة أسهل؟

وأنا أتخيل أداة تستخدم كجزء من عملية تكوين. تريد رؤوس العامة ليتم pimpl'd الطبقات، لذلك عليك تقديم بعض الملفات المدخلات، ويقول pimpl.in، تسرد فصول (تنفيذ برنامج الأمم المتحدة للpimpl'd) التي ترغب في التفاف، ثم يتم فحص هذا الملف، يتم إنشاء فصول pimpl ويتم تثبيت فقط رؤوس بهم (وليس رؤوس الطبقة الأصلية و) خلال "جعل تثبيت". المشكلة هي أنني لا أرى أي طريقة للقيام بذلك دون محلل C ++ في مهب كامل، شيء حتى الباعة مترجم لا يمكن الحصول على حق. ربما الطبقات يمكن أن تكون مكتوبة في بطريقة ما الذي يجعل وظيفة أداة خارجية أسهل، ولكن أنا متأكد من أني كنت في نهاية المطاف في عداد المفقودين جميع أنواع الحالات الزاوية (الطبقات قالب مثلا و / أو وظائف عضو قالب).

وأي أفكار؟ وقد أي شخص آخر يأتي بحل لهذه المشكلة بالفعل؟

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

المحلول

لا، ليست هناك إجابة سهلة. :-( أعتقد أن مع كل ما يقرب من خبير OO قائلا "تفضل تكوين على الميراث"، لن يكون هناك دعم اللغة لجعل تكوين الاسهل من الميراث.

نصائح أخرى

وأنا لا أقول هذا أمر جيد (شيء فقط التي ظهرت إلى الذهن).
ولكن هل يمكن أن التجربة مع الحمولة الزائدة المشغل ->

#include <memory>
#include <iostream>

class X
{
    public:
    void plop()
    {
        std::cout << "Plop\n";
    }
};

class PimplX
{
    public:
        PimplX()
        {
            pimpl.reset(new X);
        }
        X* operator->()
        {
            return pimpl.get();
        }
    private:
        PimplX(PimplX const&);
        PimplX& operator=(PimplX const&);
        std::auto_ptr<X>    pimpl;
};   


int main()
{    
    PimplX      x;

    x->plop();
}

وخيار واحد هو استخدام فئة واجهة بدلا من ذلك:

class ClassA {
  virtual void foo() = 0;
  static ClassA *create();
};

// in ClassA.cpp

class ImplA : public ClassA {
/* ... */
};
ClassA *ClassA::create() {
  return new ImplA();
}

وهذا لا ولكن إضافة النفقات العامة من جلب مؤشرات الدالة vtable.

وبخلاف ذلك، لا أستطيع التفكير في أي أداة من هذا القبيل. كما قلت، تحليل C ++ هو غير تافهة، وهناك لغات أخرى هناك حيث انها أقل من قضية (على سبيل المثال، C # أو جافا في وقت متأخر من ربط كل شيء، حتى تتمكن من تغيير على تخطيط في الذاكرة في وقت لاحق دون مشاكل).

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