سؤال

لقد قمت بإنشاء فئة الكسر التي تحتوي على وظائف عضو لإضافة وطرح وضرب وتقسيم بين كائنين من الكسر جنبًا إلى جنب مع منشئي الافتراضي المطلوبة والنسخ.

بالنسبة لهذه المشكلة ، يجب أن أستخدم المؤشرات (لا يمكن استخدام المتجهات!) لأنه لا يمكن إنشاء كائنات الكسر إلا إذا اختار المستخدم. باختصار ، إعلان المؤشر والتهيئة الجديدة في النطاقات الفرق.

أحاول أيضًا زيادة تحميل المشغل = ، المشغل+، المشغل ، المشغل*، والمشغل/ لقبول شيء مثل ما يلي.

Fraction* fr1 = new Fraction(1,2);

Fraction* fr2 = new Fraction(3,4);

Fraction* fr3 = new Fraction();

fr3 = fr1 + fr2;

مشغلتي الحالية المحملة = وظيفة العضو تبدو كذلك:

    Fraction* Fraction::operator=(const Fraction*& fr) {


      num = fr->num;

      denom = fr->denom;

      return this; 
    }

    Fraction* Fraction::operator+(const Fraction*& fr) const {

      int gcd = gcdRecurEuclid(num * fr->denom + denom * fr->num, denom * fr->denom);

      Fraction* temp;

      temp = new Fraction((num * fr->denom + fr->num * denom) / gcd, 

                          (denom * fr->denom) / gcd);

      return temp;
    }

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

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

المحلول

كما اكتشفت ، فإن محاولة استخدام مشغلي الحساب على المؤشرات ستؤدي إلى محاولة المترجم إلى القيام بحساب مؤشر. للاتصال بالمشغل الزائد الخاص بك على مؤشر ، يمكنك إما القيام به

Fraction *f, *g; // allocated with new
f->operator+(*g); /// Urgh!

أو تقريبًا قبيح

Fraction *f, *g;
(*f) + (*g);

إحدى الطرق السهلة لجعل هذا أجمل بعض الشيء هي إعلان ثلاثة متغيرات مرجعية جديدة مثل هذا:

Fraction& f1 = *pfr1;
Fraction& f2 = *pfr2;
Fraction& f3 = *ptr3;

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

نصائح أخرى

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

Fraction * operator+(const Fraction * lhs, const Fraction * rhs)
{
    ...
}

لكن، توقيع الوظيفة هذا ليس قانونيًا. لا يمكنك كتابة تحميل زائد للمشغل الذي يأخذ فقط وسيطات المؤشر. يجب أن يكون أحد الوسيطات على الأقل نوعًا محددًا للمستخدم (أي فئة ، بنية). هذه مجرد قواعد اللغة.

تحدث إلى معلمك واحصل على توضيح حول ما عليك القيام به بالضبط.

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