سؤال

أود أن أعرف ما إذا كانت هناك طريقة لوضع الأشياء المحمية والعامة فقط على ملف الرأس .h، وجميع الاشياء الخاصة في وحدة الترجمة .CPP أحتاج إلى هذا لأن المكتبة ستستخدم من قبل الآخرين، وأنا لن ترغب في نسخ وتحرير جميع ملفات .h جميع الملفات لإزالة الإعلانات والتنفيذ الخاصة. حاولت ولكن حصلت على خطأ الإعلان المكرر

سؤال آخر هو حول الأشياء الثابتة الخاصة، هل يمكنني أن أعلنهم على ملف الرأس وتنفيذها في وحدة .cpp؟ متغير خاص وطريقة الحصول عليها العامة حاولت ولكن لم أستطع تنفيذ الطريقة على الوحدة، فقد عملت فقط مع الإعلان والتنفيذ على الرأس

] S، جو

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

المحلول

الطريقة الصحيحة للتعامل مع هذا هي تطبيق Pimpl Idiom: قم بإنشاء فئة أو بنية لجميع البيانات الخاصة ووضع مؤشر على مثل هذا الكائن في ملف الرأس، جنبا إلى جنب مع إعلان إلى الأمام. الآن لا شيء من البيانات والأساليب الخاصة مرئية من ملف الرأس.

نصائح أخرى

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

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

أندرياس لديه الجواب ولكن لاحظ أن هذا سيجعل رمزك إلى حد ما بالنسبة لنفسك:

 // header file

 struct hidden_structure;

 class Foo {
     hidden_structure* hidden_data;
 public:
     Foo();
     ~Foo();

     void doStuff();
 };

 // your cpp file

 struct hidden_structure;
     int stuff;
     hidden_structure() : stuff(0) {}
 }

 Foo::Foo() : hidden_data(new hidden_structure) {}
 Foo::~Foo() { delete hidden_data; }

 void Foo::doStuff() { hidden_data->stuff += 34; } // hey, it does a lot of stuff

كما ترون، كلما زاد عدد البيانات داخل المخفي: كلما أصبح هذا أكثر تعقيدا.

لا يمكن أن تعلن اسم الفئة الكاملة للمستخدمين، ولكن ضع تعريف فئة في ملف .h الذي يتضمن فقط PRESURICS و ARMATIONS، ثم في الفئة الفرعية .cpp File Subclass من التعريف العام، وتحديد الخصوصية فقط؟

مثله:

ملف.

class useThis;   // users actually use this class

class publics {  //this is the interface they see
public:
    int foo;
};

ملف .cpp -

#include "foo.h"

class useThis: publics {

private:
    void add(int b);

};

void useThis::add( int b )
{
    foo+= b;
}

نفس رمز John، لكنني أستخدم مؤشر بدلا من المراجع:

// file.h
class TheClass_p;
class TheClass{
  public: 
    TheClass();
    ~TheClass();
  private
    TheClass_p *d;

};

// file.cpp
class TheClass_p {
  int foo;
  float: bar;
};

TheClass::TheClass(){
   d = new TheClass_p;
}

TheClass::~TheClass(){
   delete d;
}

تحرير: تمت إضافة Destructor لتحرير تسرب الذاكرة

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