سؤال

يستمر C ++ في مفاجأتي. اليوم اكتشفت عن المشغل ->*. إنه قابل للتحميل ولكن ليس لدي أي فكرة عن كيفية استدعاءه. تمكنت من زيادة تحميله في صفي ولكن ليس لدي أدنى فكرة عن كيفية تسميته.

struct B { int a; };

struct A
{
    typedef int (A::*a_func)(void);
    B *p;
    int a,b,c;
    A() { a=0; }
    A(int bb) { b=b; c=b; }
    int operator + (int a) { return 2; }
    int operator ->* (a_func a) { return 99; }
    int operator ->* (int a) { return 94; }
    int operator * (int a) { return 2; }
    B* operator -> () { return p; }


    int ff() { return 4; }
};


void main()
{
    A a;
    A*p = &a;
    a + 2;
}

تعديل:

بفضل الجواب. للاتصال بالوظيفة المحملة التي أكتبها

void main()
{
    A a;
    A*p = &a;
    a + 2;
    a->a;
    A::a_func f = &A::ff;
    (&a->*f)();
    (a->*f); //this
}
هل كانت مفيدة؟

المحلول

الحمولة الزائدة ->* المشغل مشغل ثنائي (بينما .* غير قابل للتحميل). يتم تفسيره على أنه مشغل ثنائي عادي ، لذلك في الحالة الأصلية من أجل استدعاء هذا المشغل ، عليك أن تفعل شيئًا مثل

A a;
B* p = a->*2; // calls A::operator->*(int)

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

نصائح أخرى

تماما مثل .*, ->* يستخدم مع مؤشرات للأعضاء. هناك قسم كامل على C ++ FAQ Lite مكرسة للمؤشرات إلى الأعضاء.

#include <iostream>

struct foo {
    void bar(void) { std::cout << "foo::bar" << std::endl; }
    void baz(void) { std::cout << "foo::baz" << std::endl; }
};

int main(void) {
    foo *obj = new foo;
    void (foo::*ptr)(void);

    ptr = &foo::bar;
    (obj->*ptr)();
    ptr = &foo::baz;
    (obj->*ptr)();
    return 0;
}

مثل أي Opperator آخر ، يمكنك أيضًا تسميته بشكل صريح:

a.operator->*(2);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top