خطأ في برنامج التحويل البرمجي عند استخدام التحميل الزائد للمشغل المتداخل في C++

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

سؤال

لدي فئة عنوان URL تعمل على زيادة تحميل عوامل التشغيل == و< و> و!= لإجراء مقارنة بسيطة.تحتوي فئة URL على عضو بيانات سلسلة وبعض الوظائف للعمل على السلسلة.تعمل العوامل بشكل جيد عند اختبارها باستخدام فئة URL.

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

bool URL::operator ==(URL & u) const {
    //url is the string instance variable
    return url == u.GetURL();
}

رمز لمشغلي الصفحة:

bool Page::operator ==(Page & p) const {
    //url is the URL instance variable of the Page class
    return url == p.GetURL();
}

وهذا ينتج أخطاء مثل ذلك:

src/Page.cpp: In member function ‘bool Page::operator==(Page&) const’:
src/Page.cpp:21: error: no match for ‘operator==’ in ‘((const Page*)this)->Page::url == Page::GetURL()()’
inc/URL.h:118: note: candidates are: bool URL::operator==(URL&) const

أتوقع أنه شيء غبي أنساه.هل ستثبت لي أنني على حق؟

يحرر: لقد عضتني صحة كونست في مؤخرتي.شكرا للمساعدة.

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

المحلول

كان ينبغي ان يكون:

bool URL::operator ==(const URL & u) const {
    //url is the string instance variable
    return url == u.GetURL();
}

وبالقياس على المشغلين الآخرين.

إذا كنت لا تزال تحصل على أخطاء المترجم، فربما لم تقم بذلك GetURL() ثابت كذلك:

std:string URL::GetURL() const {
    // whatever...
}

نصائح أخرى

أود أيضًا أن أشير إلى أن الأساليب (أي الواجهة العامة) موجودة لحماية الكيانات الخارجية من التغييرات في تفاصيل التنفيذ.كما أن الفصل هو صديق لنفسه تلقائيًا (لنفس السبب) وبالتالي فإن مجرد الوصول إلى أعضاء الكائن الآخر أمر جيد.

bool URL::operator ==(URL & u) const {
    //url is the string instance variable
    return url == u.GetURL();
}

يمكن كتابتها مثل:

bool URL::operator ==(URL & rhs) const
{
    return url == rhs.url;  // No need to use GetURL()
}

في رأيي، هذا يجعل الكود أكثر وضوحًا (ولكن هذا مرة أخرى رأي قد يختلف أذواقك)

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