الخاص غير CONST وظيفة عضو CONST العامة - تتعايش في سلام؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

للأسف، وأنا أتلقى تجميع الأخطاء (باستخدام ز ++ 4.3): عند استخدام كائن غير CONST استدعاء الأسلوب، ز ++ يشكو من أن الإصدار غير CONST طريقة بلدي الخاص، على الرغم من نسخة العام (CONST) موجود.

وهذا يبدو غريبا، لأنه إذا كان غير موجود النسخة الخاص غير CONST، كل شيء يجمع ما يرام.

هل هناك أي طريقة لجعل هذا العمل؟ هل تجميع على المجمعين أخرى؟

وشكرا.

مثال:

class A
{
public:
    A( int a = 0 ) : a_(a) {}
public:
    int   a() const { return a_; }
private:
    int & a()       { return a_; } /* Comment this out, everything works fine */
    friend class B;
private:
    int a_;
};


int main()
{
    A       a1;
    A const a2;

    cout << a1.a() << endl; /* not fine: tries to use the non-const (private) version of a() and fails  */
    cout << a2.a() << endl; /* fine: uses the const version of a() */
}
هل كانت مفيدة؟

المحلول

وقرار الزائد يحدث قبل التحقق من الوصول، وذلك عند استدعاء أسلوب على عدم CONST-A، يتم اختيار عضو غير CONST بمثابة مباراة أفضل. ثم فشل مترجم بسبب الاختيار وصول.

وليس هناك طريقة ل"جعل هذا العمل"، فإن توصيتي أن يكون لإعادة تسمية وظيفة خاصة. هل هناك أي حاجة إلى وجود استرجاع الخاص؟

نصائح أخرى

ووسوف تختار فقط النسخة const إذا كان الكائن المعلن هو const، وإلا فإنه سوف حدد الإصدار غير const (حتى لو كان ذلك يؤدي إلى خطأ).

وهذا يجب أن تعمل:

cout << ((const A*)&a1)->a() << endl;

وأو هذا:

A const& ra1 = a1;
cout << ra1.a() << endl;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top