ج++:طريقة ملائمة للوصول إلى المشغل [] من داخل الفصل؟

StackOverflow https://stackoverflow.com/questions/605037

  •  03-07-2019
  •  | 
  •  

سؤال

لدي فئة C++ مثقلة operator[], ، عامل تشغيل الصفيف المنخفض/الأقواس.وهذا أمر مريح للغاية خارج صفي، حيث يمكنني الكتابة foo[bar].ومع ذلك، لا أستطيع معرفة كيفية استخدام هذا الترميز عندما أقوم بتنفيذ الأساليب داخل صفي.

أعلم أنني أستطيع الكتابة operator[](bar) أو this->operator[](bar) لكن هذه الأشياء غير عملية إلى حد ما وتسلب الكثير من راحة المشغل في المقام الأول.(أعلم أيضًا أنه يمكنني فقط إضافة طريقة جديدة تستدعي عامل التشغيل.) هل هناك طريقة يمكنني من خلالها الكتابة this[bar] أو this->[bar] أو شيء لطيف بالمثل؟

ملحوظة:قد ينطبق هذا السؤال أيضًا على العديد من المشغلين الأحاديين (على سبيل المثال، كيف يمكنني الاتصال بـ foo++ من داخل الفصل؟)، لكنني شخصيا أهتم فقط operator[].

يحرر:أدركت بعد فترة وجيزة من النشر أنه يمكنني استخدامها (*this)[bar].وقد اقترحت جميع الإجابات حتى الآن هذا أيضًا.هل هناك أي بدائل أخرى؟

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

المحلول

(*this)[bar];

ويعمل بشكل جيد بالنسبة لي.

نصائح أخرى

بديل ل (*this)[bar] هو استخدام وظيفة عضو مسماة تقوم بعملها operator[].تعمل عوامل التشغيل المحملة بشكل زائد على تسهيل الأمور على المستخدمين.والأهم من ذلك أنهم جزء من صفك واجهه المستخدم.اسأل نفسك عما إذا كان من المنطقي حقًا تنفيذ فصلك من حيث الواجهة العامة الخاصة به.إذا لم يكن الأمر كذلك، أقترح كتابة وظيفة عضو منفصلة (محمية أو خاصة) للقيام بهذا العمل، ومن ثم القيام بذلك operator[] وأي وظيفة أخرى نسميها.

أستخدم دالة at()، وأطلب من عامل التشغيل[] استدعاء وظيفة at() خلف الكواليس، لذا فإن عامل التشغيل[] هو مجرد سكر نحوي.هذه هي الطريقة التي يقوم بها std::vector، لذا تبدو طريقة معقولة (ذات أسبقية) للقيام بذلك.

الآن للحصول على اختراق نحوي كامل للسكر (لا أستطيع أن أقول إنني أوصي به تمامًا ولكن قد يلفت انتباهك):

class Widget
{
    Widget&     self;
public:
    Widget() :self(*this)
    {}

    void operator[](int)
    {
        printf("hello");
    }

    void test()
    {
        //scripting like sugar
        //you pay the price of an extra reference per class though
        self[1]; 
    }
};


int main(int argc, char* argv[])
{
    Widget w;
    w[1];
    w.test();
    return 0;
}

وأيضًا إذا كنت تريد القيام بذلك مجانًا، دون دفع تكلفة المرجع، و أنت من أتباع طائفة شريرة مكرسة لجعل المبرمجين يعانون، يمكنك القيام بذلك:

#define self (*this)

في الواقع، أعتقد أن هذه هي الطريقة التي يتم بها تنفيذ معظم المقابض في NS API من Apple...

استخدم

(*this)[bar]

واستدعاء operator[] الكائن سبيل المثال.

وthis[bar] يعامل مؤشر this كصفيف والفهارس وعنصر bar عشر من هذا الصفيف (إرجاع مرجع كائن المرجح-صالح).

هل يمكن استخدام على (* هذا) [شريط] ، لكن قد لا يكون الكثير من التحسن ...

 operator[](bar) 

وهذا يجب أن تعمل أيضا. بالنسبة لي كان يعمل!

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