C++ תוכנית קורסת כשמשתמשת בפונקצייה בונה - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

C++ תוכנית קורסת כשמשתמשת בפונקצייה בונה


MrAlex

Recommended Posts

המחלקה:


class rect {
int x,y;
public:
rect(int a,int b);
int area();
int perimeter();
void print();
void show();
};
rect :: rect(int a,int b)
{
if(a>0 && a<80)
x=a;
else
{
cout<<"error inputting number a\n";
exit(1);
}
if(b>0 && b<25)
y=b;
else
{
cout<<"eroor inputting number b\n";
exit(1);
}
}

void rect :: show()
{
int showingArea,showingPerim;
cout<<x<<'\n';
cout<<y<<'\n';
showingArea= area();
cout<<"The area of X and Y is "<<showingArea<<'\n';
showingPerim= perimeter();
cout<<"The perimeter of X and Y is "<<showingPerim<<'\n';
print();
}
int rect :: area()
{
int z;
z=x*y;
return(z);
}
int rect :: perimeter()
{
int z;
z=2*(x+y);
return(z);
}
void rect :: print()
{
int z,p;
for(z=0;z<x;z++)
{
for(p=0;p<y;p++)
cout<<"*";
cout<<'\n';
}
}

תוכנית MAIN:


int main()
{
int a,b;
cin>>a>>b;
rect rct1(a,b);
rct1.show();
cin.get();
}

התוכנית מקבלת שתי משתנים וניסגרת

אולי זאת קריסה לא יודע

אני יודע שהיא לא עובדת :P

קישור לתוכן
שתף באתרים אחרים

בוא נתחיל מזה שלא כותבים למשתמש מתוך rect, לא זורקים exception ולא יוצאים באמצע CTOR / DTOR.

תוריד את השורות האלה.

חוצמזה תעשה DEBUG שורה שורה ותראה על מה אתה עף.

מה הכוונה

לא כותבים למשתמש מתוך RECT?

ואתה מדבר על השורות של הEXIT שמחזיר ערך של 1?

(כשהתכוונת לCTOR DCTOR כי אין לי מושג על מה אתה מדבר :P)

קישור לתוכן
שתף באתרים אחרים

אתה בטוח בכלל שאתה עף?

יכול להיות שהתכנית פשוט מסתיימת ויוצאת.

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

היא פשוט מסתיימת ניראלי

אני מקליד מספרים שעומדת בתנאים של הIF

ופשוט יוצאת 0=

עריכה:

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

קישור לתוכן
שתף באתרים אחרים

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

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

בכל מקרה, הבעיה שיש לך נובעת מה-buffering שיש ל-cin. אתה מוזמן לקרוא עוד ב-FAQ.

קישור לתוכן
שתף באתרים אחרים

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

יש.

אתה משאיר את האובייקט במצב לא יציב בזיכרון. הוא לא נמחק, והוא לא ניתן לשימוש בשאר הקוד.

כנ"ל - אסור לזרוק מתוך DTOR, כי כשאתה זורק exception איפשהו בקוד, כל האובייקטים שהיו על ה STACK בסקופ המקומי נמחקים - קרי - נקראים ה DTORים שלהם.

אם זורקים exception בתוך מהלך זריקת exception- טוב זה לא ייגמר. סמוך עלי, או שאתה מוזמן לכתוב קוד של כמה שורות ולראות מה קורה.

אלה הרגלים רעים.

לכן אם אתה צריך לעשות משהו שעשוי להיכשל - לא כותבים אותו בבנאי אלא בפונקציית INIT נפרדת.

קישור לתוכן
שתף באתרים אחרים

אני צריך להשאיר את הקוד כמו שהוא עכשיו?

או לשנות דברים

יש לי VISUAL C++ 2010 זה עושה אוטומטית DEBUG אחרת לא היה מפעיל ביכלל את התוכנית אם הייתה שגיאה

זה אומר לי אחרי שאני מכניס נתון:

Run-Time Check Failure #3 - The variable 'b' is being used without being initialized.

קישור לתוכן
שתף באתרים אחרים

יש.

אתה משאיר את האובייקט במצב לא יציב בזיכרון. הוא לא נמחק, והוא לא ניתן לשימוש בשאר הקוד.

כנ"ל - אסור לזרוק מתוך DTOR, כי כשאתה זורק exception איפשהו בקוד, כל האובייקטים שהיו על ה STACK בסקופ המקומי נמחקים - קרי - נקראים ה DTORים שלהם.

אם זורקים exception בתוך מהלך זריקת exception- טוב זה לא ייגמר. סמוך עלי, או שאתה מוזמן לכתוב קוד של כמה שורות ולראות מה קורה.

אלה הרגלים רעים.

לכן אם אתה צריך לעשות משהו שעשוי להיכשל - לא כותבים אותו בבנאי אלא בפונקציית INIT נפרדת.

אתה צודק לגבי dtor, אבל ממש לא לגבי ctor. בבירור האובייקט הוא לא יהיה בשימוש בשאר הקוד, אבל אין דבר כזה "שאר הקוד" - הרי עפה לך הרגע חריגה! כל הקוד שבא אחרי יצירת האובייקט, באותו ה-scope, לא יתבצע גם ככה. כיוון שהאובייקט רק קיים ב-scope הזה, גם ככה לא תהיה גישה אליו.

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

זה אומר לי אחרי שאני מכניס נתון:

Run-Time Check Failure #3 - The variable 'b' is being used without being initialized.

קראת את הודעת השגיאה וניסית להבין מה היא אומרת? היא אומרת לך בדיוק מה הבעיה.

קישור לתוכן
שתף באתרים אחרים

לא משנה

הצלחתי לסדר

אבל עכשיו אני אמור ללחוץ הרבה פעמים אנטר כיד לצאת 0=

יש סידור לזה xD?

תודה רבה רבה לשניכם :)

עריכה :

לא משנה פתרתי גם את זה :)

תודה רבה

(חוץ מי זה שלא הבנתי על מה דיברתם על DTOR וכל השאר הבנתי הכל)

תודה רבה ^_^

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...