עבור לתוכן

class- מחלקות (++C)

Featured Replies

פורסם

היי...

אני אשמח אם תוכלו לתת לי קצת הסבר לגבי class.

הבנתי שיש בזה חלקים שהם public ו- private.

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

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

למה הכוונה שאומרים לי בונים והורסים (constructor) ומה הכוונה לדיפולטי?!?!? (יש פונקציות/ מתודות שיש להם בונים והורסים ויש כאלה שמשתמשים בדיפולטי...מה הכוונה?!?!?!?).

מומולץ לעשות לזה קבצי C ו H בנפרד?

אני יודעת שזה הרבה להסביר אבל אולי בשפה יותר פשוטה -מאנשים, אני אבין.

תודה :)

פורסם

מאיזה מקור את לומדת ++C?

public זה דברים שהמחלקה חושפת כלפי חוץ, כלומר מאפשרת לפונקציות ומחלקות שמחוץ למחלקה לגשת אליהם.

private זה דברים שהמחלקה לא חושפת, והיא מאפשר רק לפונקציות של אותה המחלקה לגשת אליהם.

למה זה טוב? בשביל אבסטרקציה. המחלקה לפעמים צריכה לשמור לעצמה נתונים שהיא לא רוצה שתהיה אליהם גישה מבחוץ. נניח לדוגמה שיש לנו מחלקה שמייצגת מספר רציונלי (דהיינו מספר מהצורה a/b כאשר a ו-b שלמים, ו-b שונה מ-0). אז למחלקה הזו צריכים להיות שני איברים שמחזיקים את ה-a ו-b הללו. אם השדות האלה היו public, אז כל מי שרוצה היה יכול לשנות אותם. אבל אז אפשר היה לשנות אותם לערכים לא חוקיים (לדוגמה, לקבוע b=0), ולגרום לשגיאות. אם לעומת זאת a ו-b הם שדות פרטיים, אז רק המחלקה עצמה יכולה לגשת אליהם, וככה לדאוג שאף אחד לא מורשה לא יוכל לשנות את השדות האלה.

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

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

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

כן, תמיד מומלץ להפריד בין קבצי C ו-H (בקובץ H שמים את ההגדרות של מחלקות ופונקציות, ובקובץ C שמים את המימוש של פונקציות)

פורסם
  • מחבר

לומדת מכל מקור מידע אפשרי ובנוסף מהמרצה שלי שמרצה יותר לעצמו.

איך זה יכול לעזור? יש לי תרגיל עם לוח שנה. איך זה יכול להועיל לי?

פורסם
  • מחבר

וד״א תודה :)

פורסם

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

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

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

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

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

תודה.

בהמשך לנושא...

האם אפשר לעשות רשימה מקושרת של קלאסים?

איך זה מתבצע בתכלס?

נגיד שהשם של ה class הוא אתי:

עושים ב private

Eti* next? כמו במבנים?

ואז ב public אני עושה פונקציות שמעדכנות את הרשימה כל הזמן?

פורסם
  • מחבר

טנקס :xyxthumbs:

פורסם
  • מחבר

גם שליחת מחלקה למחלקה אחרת נעשת כמו מבנה למבנה ?

ישנה מחלקה בשם time שנכנסת בתוך מחלקה בשם clock.

אני שולחת time* myTime ?

פורסם

ב-++C אין הבדל מעשי בין מחלקה למבנה (יש הבדל, אבל הוא די מינורי). את שניהם מעבירים לפונקציות בדיוק באותה צורה.

פורסם
  • מחבר

אז אולי אני עושה משהו לא נכון?

זה לא עובד לי.

נותן לי הודעת שגיאה:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

זה הclass שלי: (time ו date גם class כל אחד בנפרד)

 
class Event{
private:
Time* startTime;
Time* endTime;
Date* startDate;
Date* endDate;
Event* next;

public:
Event( Time* startTime, Time* endTime, Date* startDate, Date* endDate);
~Event();
};

פורסם

ההגדרה פה נראית בסדר, אבל יכול להיות שחסרים לך דברים אחרים.

עשית אינקלוד לכל הקבצים הדרושים?

באיזו שורה בדיוק השגיאה?

פורסם
  • מחבר

על כל שורה של time* או date* זה נותן לי את השגיאה הזו...

Time* startTime;

Time* endTime;

Date* startDate;

Date* endDate;

זה רושם: (לכל שורה בנפרד) 1>error C2143: syntax error : missing ';' before '*'

1>error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

1>error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

פורסם
  • מחבר

העניין הוא שעד שהגעתי ל H של EVENT הכל עבד מעולה.

רק פה התחילה הבעיה..

פורסם

יכול להיות שלא עשית include של ה-h של Time ו-Date בתוך ה-h של EVENT ?

ארכיון

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

דיונים חדשים