OOP ב- ++C

inkydinky

New member
OOP ב- ++C

יש כמה דברים שלא ברורים לי מכמה שיעורים אחרונים ב-OOP. אודה לכם אם תוכלו להסביר לי. 1) למה בדיוק צריך Copy Ctor? מה אמורים לעשות בו יוצא דופן (אם בכלל יש בו איזה קטע טריקי)? זה נדמה לי או שהוא נקרא בצורה אוטומטית מתישהו? 2) כאשר עושים overloading לאופרטור ´=´ אני מבין שיש משהו שאמורים לעשות כדי למנוע תעופה... משהו שקשור בהצבעות לאותו מקום... ולא לעשות סתם השמה בין כל מיני data members... אני לא יודע בדיוק מה ולמה. יש לכם מושג? הוא נקרא אוטומטית מתישהו או שנדמה לי? 3) למה כשאני עושה מחלקת אב שמחלקות אחרות יורשות ממנה אז ה-destructor תמיד חייב להיות virtual? איך זה משנה? 4) Polymorphism זה משהו שאני לא בטוח שאני מבין. מגדירים מחלקת אב עם פונקציות וירטואליות. אחרי זה מגדירים מחלקות בנות של המחלקה הזו, שיורשות ממנה ושם מממשים את הפונקציות הוירטואליות האלה. בתוכנית הראשית מה שעושים זה להגדיר פוינטר למחלקת האב ואובייקטים מטיפוס המחלקות הבנות ואז אם מתברר שצריך שהאובייקט של מחלקת האב יהיה ב"צורה" שונה אז משנים את ההצבעה של הפוינטר שיצביע על אחד האובייקטים מהמחלקות הבנות (עם ההסבה הדרושה למחלקת האב)? ופונקציות וירטואליות טהורות... זה אומר שאין לי משמעות לפונקציה הזו במחלקת האב אבל יש לה משמעות ומימוש שונה במחלקות הבנות אז אני מממש את זה רק במחלקות הבנות? 5) הבנתי גם שכדי להפעיל אופרטור ´=´ של מחלקה מסויימת שיורשים ממנה (אני חושב) אז צריך לקרוא לו מפורשות. משהו כמו לכתוב (operator=(paramater ולא להשתמש בו ישירות... אני לא בדיוק יודע מה ולמה... ולא ברור לי כ"כ על מה אני מדבר כאן... אולי למישהו אחר כן ברור והוא יכול להסביר לי? תודה מראש, IDD
 
ההעמסות (שא´ 1 ו 2)

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

inkydinky

New member
תודה. אני חושב שהבנתי עכשיו.

אני מבין שאותו דבר תקף לגבי אופרטור "=". שוב תודה, IDD
 

linuxius

New member
כמו שעניתי לך בוואלה

1.COPY CONSTRUCTOR הוא בנאי שמקבל אובייקט מן המחלקה ומעתיק את הנתונים מאותו אובייקט לאובייקט שנוצר. (יש להזהר כי בבנאי שמספק הקומפיילר ההעתקה של אחד-לאחד ז"א משתנה חבר במחלקה שהועברה כפרמטר יועתק בדיוק למשתנה המקביל במחלקה הנוצרת (ראה 2)). 2.מה שקורה הוא שעם לא ממשים COPY CONSTRUCTOR אחר או מעמיסים את האופרטור "=" תהיה העתקה כמו שדיברתי עליה. ואז עם אחד המשתנים החברים באוביקט המחלקה מממנה מעתיקים הוא פוינטר שהקצנו עבורו,אז בעצם יש לנו שתי פוינטרים לאותו אזור זיכרון, ואז כשאחת מן המחלקות תהרס (עקב יציאה מתחום הגדרה או delete) הפוינטר של המחלקה השנייה שמשתמשת בזיכרון ההוא תתקל בבעיות. 3.virtual function שאנו מגדירים במחלקת אב גורמות לכך שתווצר לכל אובייקט מן המחלקה הנ"ל ומהמחלקות שיורשות ממנו "טבלת פונקציות וירטואליות" VTABLE ולכן כאשר אני ממשים פונקציה וירטואלית במחלקת בן, כאשר נצביע על אובייקט מחלקת בן בעזרת פוינטר למחלקת האב ונקרא לפונקציה, תקרא הפונקציה שממשנו המחלקת הבן ולא במחלקת האב כפי שהיה קורה אם הפונקציה לא היתה וירטואלית. 4.pure virtual function גורמת למלקה להפוך לאבסטרקטית כלומר מחלקה שאי אפשר ליצור ממנה אובייקטים אבל אפשר לירוש ממנה וחייבים לממש את כל הפונקציות הוירטואליות הטהורות שהוגדרו בתוכה. כך אנו בעצם כופים על מחקה יורשת לממש פונקציות מסויימות. מחלקות אסבסטרקיות ישמשו בד"כ כראש בשרשרת ירושה כדי לחייב ממשק אחיד בין מחלקות יורשות.
 

inkydinky

New member
עוד לא בדקתי בוואלה... ותודה.

אבל אני לא בטוח שהבנתי לגבי 3... אתה מתכוון שאני חייב להגדיר את ה-dtor כוירטואלי כי אני חייב לממש אותו בצורה שונה בכל מחלקת בן כדי שזה יהיה ה-dtor הנכון שייקרא ולא dtor אב? לא ברור לי כ"כ למה עדיין... שוב תודה, IDD
 

linuxius

New member
בדיוק- ככה יקרא ה-destructor הנכון!

בדיוק- ככה יקרא ה-destructor הנכון!
 

ihovav

New member
CCtor :

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

ihovav

New member
הסבר - פונקציות ווירטואליות :

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

inkydinky

New member
תודה...

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

ihovav

New member
הסבר - משתנים

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