سؤال

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

لدي فئة تسمى P والتي تؤدي بعض الأغراض المميزة.لدي أيضًا PW الذي يؤدي بعض الأغراض المميزة على P.لا يحتوي PW على متغيرات الأعضاء، بل وظائف الأعضاء فقط.

من هذا الوصف تفترض أن الكود سيتبع مثل هذا:

class P
{
public:
    void a( );
};

class PW
{
public:
    PW( const P& p ) : p( p ) { }
    void b( );
    P& p;
};

class C
{
public:
    P GetP( ) const { return p; }   
private:
    P p;
};

// ...
    PW& p = c.GetP( ); // valid
// ...

لكن هذا يثير مشكلة.لا أستطيع استدعاء وظائف P دون المراوغة في كل مكان.

// ...
    p->p->a( )
// ...

ما أود فعله هو الاتصال بـ p->a() وجعله يحدد تلقائيًا أنني أرغب في استدعاء وظيفة العضو في P.

كما تم استدعاء أحد أعضاء PW أ لا يتم قياسه حقًا - ماذا لو أضفت (أو أزلت) وظيفة أخرى إلى P - سيلزم إضافتها (أو إزالتها) إلى PW.

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

المحلول

يمكنك محاولة تجاوز عامل التشغيل* وعامل التشغيل-> لإعادة الوصول إلى الصفحة المضمنة.شيء مثل هذا قد يفي بالغرض:

class P
{
  public:
    void a( ) { std::cout << "a" << std::endl; }
};

class PW
{
  public:
    PW(P& p) : p(p) { }

    void b( ) { std::cout << "b" << std::endl; }

    P & operator*()  { return p;  }
    P * operator->() { return &p; }

  private:
    P & p;
};

class C
{
  public:
    P & getP() { return p; }

  private:
    P p;
};


int main()
{
  C c;
  PW pw(c.getP());

  (*pw).a();
  pw->a();
  pw.b();

  return EXIT_SUCCESS;
}

تتم طباعة هذا الرمز

a
a
b

ومع ذلك، قد تربك هذه الطريقة المستخدم نظرًا لأن دلالات عامل التشغيل* وعامل التشغيل-> تصبح مشوشة قليلاً.

نصائح أخرى

إذا جعلت P فئة فائقة لـ PW، كما فعلت في سؤالك السابق، فيمكنك الاتصال بـ p->a() وسيتم توجيهها إلى الفئة P.يبدو أنك قد فكرت بالفعل في هذا الأمر ورفضته، انطلاقًا من هذا السؤال.إذا كان الأمر كذلك، هل تهتم بتوضيح سبب عدم نجاح هذا الأمر بالنسبة لك؟

أعتقد أنك بحاجة إلى التفكير في نوع العلاقة الموجودة بين PW وP.

هل هي علاقة؟هل مثيلات PW هي مثيلات P؟إذن سيكون من المنطقي أن يرث PW من P.

هل هي علاقة؟ثم يجب عليك الالتزام بالاحتواء، وتحمل الإزعاج النحوي.

بالمناسبة، ليس من الجيد عمومًا الكشف عن مرجع غير ثابت لمتغير عضو في الواجهة العامة للفئة.

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