עבור לתוכן

קאסטינג של int ל-enum C++ VS6.0

Featured Replies

פורסם

או שלא.

סתם דוגמאות שעולות לי עכשיו לבעיות כפי שציינתי: מי מטפל ב-exception שנזרק מאתחול של אובייקט גלובלי? מה אם הועבר ל-constructor מצביע לזכרון שהוקצה דינמית (מי אחראי לשחרור שלו)?

ב-constructor אתה צריך לשים רק דברים שלא יכולים לזרוק\להיכשל, ואת כל השאר תשים ב-init\מתודה אחרת כרצונך.

פורסם

לא אמרתי שזה תמיד הדבר הנכון. ברוב המקרים, עדיף ctor שזורק exceptions מאשר פונקציות init.

זכרון שהוקצה דינמית: מה זאת אומרת? מי שהקצה הוא מי שמשחרר (אלא אם בתיעוד שלו מצויין אחרת), זה הדבר הנהוג. עף exception? אז מי שהקצה את הזכרון אחראי לתפוס את ה-exception ולשחרר את הזכרון (ואז הוא יכול לזרוק את ה-exception מחדש). בדיוק בשביל זה נועד המבנה try/finally בשפות אחרות.

ה-init הוא מכוער, כי הוא דורש ממך להוסיף משתנה שיקבע האם האובייקט תקין או לא, ואז אתה צריך להתייחס כל הזמן אל אותו משתנה.

פורסם
  • מחבר

מחבינה לוגית גם זה לא כ"כ מדוייק. לפעמים אין לך דרך לאתחל אובייקט אלא בפרמטרים שנשלחו ובדיקת תקינות שלהם.

פורסם

את זה אפשר ליישם על ידי מצביע.

קחו למשל את הקוד הבא:

class A {...};
class B {...};
class C {...};
...
A a(new B(some_params), new C(some_params);

מה קורה אם היצירה של C זורקת שגיאה?

לדעתי או שאתה כותב פונקציית init, או שאתה כותב פונקציית "getInstance" ומסתיר את ה-constructor, אבל אין מצב ש-constructor זורק.

פורסם

אם אתה חושד שהבנאי של C יכול לזרוק שגיאה, אז אתה צריך לעטוף אותו ב-try/catch.

בכל מקרה, לא מומלץ להקצות זכרון בלי לשמור התייחסות אליו.

פורסם

באופן כללי - אם אתה רוצה להקצות זיכרון באובייקט כלשהו, מומלץ לפרק אותו לכמה שיותר חלקים, בגלל שC++ עושה מפעילה את הDTOR רק לממברים שאותחלו במלואם במקרה שהיה כישלון בCTOR. הDTOR של הממבר אמור לשחרר את הזיכרון.

יש עוד דבר - יש חור אחד בשפה שמאפשר לבצע דבר כזה(בערך):


MyClassName()
try : base(param), member1(init_param), member2(...), ...
{
ctor body
}
catch
{

}


פורסם

אם אתה חושד שהבנאי של C יכול לזרוק שגיאה, אז אתה צריך לעטוף אותו ב-try/catch.

שורש הבעיה הוא שבנאי יכול לזרוק שגיאה. זה לא צריך לקרות בשום מקרה.

פורסם

הדוגמה שנתת לא מומלצת מכמה סיבות:

א. אתה מקצה זכרון בלי לשמור מצביע אליו.

ב. אתה סומך על הקלאס A שישחרר את המצביע הזה כשצריך. אלא אם A הוא קלאס שנועד לטפל בזכרון (כמו auto_ptr), זה גם לא כדאי.

בכל מקרה, גם חיפוש קטן בגוגל העלה לא מעט אתרים (כמו האתר הנ"ל) שממליצים לזרוק חריגות מתוך constructors על מנת לטפל בשגיאות.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים