Casting ב- ++C - בעד ונגד.

  • פותח הנושא galh
  • פורסם בתאריך

vinney

Well-known member
להוסיף מחלקה זה כבר שינוי ניתוח

ולא תמיד טריויאלי, אבל זה פתרון יותר טוב מcasting.
 

Pembelton

New member
קראתי, ומדובר בדיוק על פולמורפיזם

מחלקות שיש להן דברים משותפים זה פחות או יותר פולימורפיזם
 

vinney

Well-known member
פחות או יותר זה לא בדיוק

במיוחד כשאחד הפתרונות שהוזכר היה template (?????)
 

Pembelton

New member
VISITOR פותר את הבעיה הזאת

אתה יכול להגדיר Visitors שונים לפי הפעולות השונות שאתה רוצה לבצע.
struct IVisitor; struct Employee { virtual void accept(IVisitor v) { v.visit(*this); } }; struct Boss : Employee { void accept(IVisitor v) { v.visit(*this); } }; struct IVisitor { virtual ~IVisitor() { } virtual void visit(Boss& b); virtual void visit(Employee& e) = 0; }; struct Visitor : IVisitor { void visit(Boss& b) { // do boss specific action } void visit(Employee& e) { // do employee specific action } };​
 

Pembelton

New member
יש פה שגיאה קטנה:

את ההגדרה של IVISITOR צריך לשים למעלה, ולהוסיף FORWARD DECLARATION עבור המחלקות BOSS ו- EMPLOYEE
 

neko

New member
MEYER פותר את הבעיה ע"י

ביטול האפשרות לCASTING, והכנסת פעולה יחידה מסוג:
Manager x x ?= array​

שמציב בx את האובייקט שבמערך, רק בתנאי שהטיפוס מתאים. אם לא, x ישאר NULL. אמנם הפקודה הזאת לא קיימת ב++C או בJAVA, אבל בהחלט אפשר לסמלץ אותה ע"י INSTANCEOF או הפקודה המקבילה (שאני מניח שקיימת?) ב++C, וזה נותן לך אפשרויות הרחבה (אם X מוגדר אחרי הפעולה הנ"ל, אפשר לבצע על האובייקט את הפעולות שיחודיות לו).
 

voguemaster

New member
בהחלט

אם כי, כל מי שאי פעם שאלתי טוען ש-dynamic cast הוא אסון שאין כדוגמתו. לדעתי אני אפילו העליתי את הסוגיה בפורום לא מזמן.. זה ד"א גם דורש RTTI מופעל בקומפיילר (ברירת מחדל כמובן, אבל יש כאלו שמכבים את הדבר הזה)
 

annefan

New member
סתם הערה

רוב הקומפיילרים לא מפעילים RTTI כברירת מחדל.
 

vinney

Well-known member
זה באמת אסון

אבל עם דעותיי על הcasting, אני פשוט לא משתמש בו :)
 

חובבן

New member
את מי שאלת? כנראה שהוועדה של ++C

חושבת אחרת. בקומפיילר של Sun האפשרות של RTTI, מופעלת אוטמטית. האם בקומפיילר שלך ניתן לעבוד עם exceptions בלי RTTI?
 

annefan

New member
אז הוא חריג

וכן, ב-GCC וב-VS אפשר לעבוד עם חריגות גם בלי RTTI.
 

annefan

New member
אני גם לא

הערתי שתי הערות שאינן קשורות: א. GCC, VC6, VS7.1, כולם באים כש-RTTI (הגירסה המלאה, לא לפולימורפיזם) אינו מופעל. ב. בכולם ניתם לעבוד עם exceptions בלי RTTI.
 

annefan

New member
בוא נרגע קצת

ברור שזו פעולה שלא צריך לדחוף אותו בכל חור, ואפילו להימנע ככל האפשר. אבל, לפעמים יש לו מקום, ולפעמים אפילו אין ברירה. יש לא מעט דברים כאלה ב-++C (לדוגמא, goto, מקרואים וכד'), וכמו כל הדברים האלו, צריך להכיר טוב-טוב, לדעת מתי חייבים להשתמש, ובעיקר מתי לא חייבים להשתמש.
 
למעלה