אזהרה על throw בהכרזה:

selalerer

New member
אזהרה על throw בהכרזה:

ב MSVS אני יותר מחלקה ובבנאי שלה מכריז שהיא הולכת לזרוק סוג מסויים של אובייקט, בפונקציה במידה ומתקיים תנאי מסויים היא באמת זורקת את התנאי אבל VS נותן לי אזהרה:
(18 : warning C4290: C++ Exception Specification ignored​
הגדרת המחלקה:
class temp1 { public: temp1() throw (int); };​
והמימוש:
temp1::temp1() { throw 17; }​
למה זה נותן לי את האזהרה? אני כן משתמש בthrow עם הטיפוס שאמרתי שאני אזרוק. יש איזה משהו שאני לא מבין בנושא? תודה, סלע.
 

annefan

New member
יש לך טעות

קודם כל, אם אתה מכריז מה אתה הולך לזרוק, אתה צריך לכתוב גם בהגדרה:
class temp1 { public: temp1() throw (int); }; temp1::temp1() throw (int) { throw 17; }​
(ב-gcc הקוד שלך גורם לטעות קומפילציה). דבר שני, VS אמנם לא מממש את הקוד הזה, ולכן הוא מתריע בפניך שבעצם אין לו משמעות. דבר שלישי, לפי שמה ש-Herb Sutter כותב זה גם לא רעיון מי יודע מה... (סעיף 4)
 

selalerer

New member
OK, אז כתבתי גם במימוש את throw אבל

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

annefan

New member
מה כתבתי בסעיף השני?

VS לא מממש את הסטנדרט בהיבט הזה, ולזכותו יאמר שהוא מודיע לך על זה. הקוד שלך יתקמפל וירוץ, אבל אם תבנה על ה-throw הזה, אתה עלול להיות מופתע... (וסתם הערה, אני אגלה)
 

selalerer

New member
אז אני עדיין יכול לזרוק exeption או

שגם מה throw עצמו הוא מתעלם? תודה רבה, סלע.
 

Pembelton

New member
אתה יכול לזרוק מה שבא לך,

VS יתן לך לזרוק מה שאתה רוצה, בעוד שלפי הסטנדרט הוא היה אמור לייצר שגיאת קומפילציה אם אתה זורק טיפוסים שלא הצהרת עליהם.
 

selalerer

New member
לא מדוייק, הוא אמור לקרוא לפונקציה

unexpected שאתה יכול לשנות אותה עם set_unexpected.
 

vinney

Well-known member
הוא מתעלם מההכרזה, זה הכל

הwarning לא אומר יותר ממה שהוא - ראה את ההכרזה, מתעלם ממנה, זהו. אם אתה עושה THROW וCATCH אז הכל יהיה בסדר (עם CONST INT נראה לי)
 
למעלה