הקומפיילר וOOP

tseliot

New member
הקומפיילר וOOP

הקוד הבא מניב שגיאה לגבי ambiguity:
class A { private: int X; public: A(int XVal){X=XVal;} }; class B { public: int X; B(int XVal){X=XVal;} }; class C:public B,public A { public: C(int XVal):A(XVal),B(XVal){} void DoIt() { X=2;//This line causes the ambiguity error... } };​
ברור למה הוא רושם את זה, אבל לא נראה לי הגיוני שהמצב הנ"ל יוגדר כambiguity, מכיוון שהX של מחלקה A הוא פרטי, ולפיכך הוא לא אמור להיות רלוונטי למחלקה C, היות ובכל מקרה אין לה גישה אליו. הרי כל הרעיון הוא הפשטה, לא? אז מה זה עוזר אם בסך הכל אני עוד פעם צריך להסתכל ברכיבים הפנימיים של המחלקה? המצב הזה גם ייצור בעיות שבהן אני ארש ממחלקה שמישהו אחר יצר ולפתע יהיה רשום לי AMBIGUITY ... ממש לא ברור לי למה זה כן טוב... למה לא בחרו כן לסמן כשגיאה כזה מקרה?
 

tseliot

New member
תיקון למשפט האחרון...

למה לא בחרו לא לסמן כשגיאה כזה מקרה?
 

vinney

Well-known member
זה ברור

יש לך שני משתנים באותו שם בnamespaces שונים. כדי למנוע מהשגיאה, אתה צריך להגיד בפירוש לאיזה אתה מתכוון : אם זה של B אז B::X, ואם זה של A אז A::X (ובמקרה זה באמת תקבל שגיאה של private).
 

mooznach

New member
אז ככה.

הקטע הוא ששינוי access level לא אמור לשבור את הקוד. במקרה הזה, אם יום אחד תחליט להפוך את x של A ל public, אז יש לך error.
 
למעלה