ABA


"|++C| איך להעביר מצביעים למתודות של מחלקה כפרמטרים?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15780 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15780
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   20:08   23.03.10   
אל הפורום  
  |++C| איך להעביר מצביעים למתודות של מחלקה כפרמטרים?  
 
אני צריך לממש רשימה מקושרת גנרית. כלומר (*void)
כחלק מהעניין, אני צריך שהמחלקה של רשימה מקושרת, תדע למיין ולמחוק אובייקטים.
כמובן שמכיוון שאין לי דרך לדעת איזה סוג אובייקטים יקושרו ברשימה המקושרת, אני צריך לקבל מצביעים לפונקציית מחיקה\השוואה\וכו'...

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

- השאלה שלי היא:
איך להעביר מצביעים לאותן מתודות כפרמטרים לקונסטרקטור של הרשימה המקושרת?

הסתבכתי עם זה לאללה...


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אם הבנתי נכון.. Delegate זה הפיתרון בשבילך עידן_הכלי 23.03.10 20:47 1
     חיפוש קצר העלה הרבה חומר שקשור ל-Csharp Zippo  23.03.10 21:27 2
  אתה יכול להניח שהאובייקטים שאתה מוסיף בעל אינטרפייס ldan192  23.03.10 22:17 3
     כל רשימה מקושרת (יהיו 2 או 3 בתרגיל הזה) תהיה מסוג אחיד Zippo  23.03.10 22:47 4
     לא צריך upcasting אפילו... הכל מתבצע Implicit DLN 26.03.10 00:17 17
         בסוף מימשתי את זה בצורה גנרית, Zippo  26.03.10 00:55 19
  יש כמה שיטות לטפל בבעייה הזאת Net_Boy  23.03.10 22:59 5
     תשובה Zippo  23.03.10 23:15 6
         כמה נקודות חשובות Net_Boy  23.03.10 23:42 7
             אני לא בטוח שאני מבין מה זה ''friend'' או STL Zippo  24.03.10 00:17 8
                 אין בעד מה Net_Boy  24.03.10 00:44 9
                     תודה, שאלה נוספת. Zippo  24.03.10 16:01 10
                         אתה בטוח שהם רוצים שהרשימה שלך תהיה ממוינת ? Net_Boy  24.03.10 20:11 11
                             היא לא צריכה להיות ממוינת. Zippo  24.03.10 20:49 12
                                 אז למה אתה צריך להעביר לרשימה פונקצית השוואה? Net_Boy  24.03.10 21:00 13
                                     איך נשמע פתרון כזה?: Zippo  24.03.10 21:22 14
                                         אתה מתכוון לאובייקטי מיקום ? אם כן אז זה סבבה Net_Boy  24.03.10 23:27 15
  אם הבנתי אותך נכון DLN 26.03.10 00:16 16
     הלוואי והייתי יכול לעשות את זה. אסור Zippo  26.03.10 00:53 18

       
עידן_הכלי

   20:47   23.03.10   
אל הפורום  
  1. אם הבנתי נכון.. Delegate זה הפיתרון בשבילך  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   21:27   23.03.10   
אל הפורום  
  2. חיפוש קצר העלה הרבה חומר שקשור ל-Csharp  
בתגובה להודעה מספר 1
 
לא כ"כ ל- ++C

בכל אופן, הנה הקטע שאני מסתבך בו:

Board* zeroBoard;
zeroBoard = new Board();
lloBoards = new LinkedListObject((void**)zeroBoard,
void (*freeBoard))(Board),
bool (*cmprBoards)(Board, Board));

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

# include "node.h"

class LinkedListObject
{
private:
S_Node* node;
int length;
void (*FreeNode)(void*);
bool(*CmprNode)(void*,void*);
public:
LinkedListObject(void (*FreeNode)(void*), bool(*CmprNode)(void*,void*));
LinkedListObject();
~LinkedListObject();
void AddNode(void**);
};

ושל המבנה של כל איבר:

# include <iostream>

struct S_Node
{
S_Node* next;
void** cell;
};

typedef S_Node* Node;

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:17   23.03.10   
אל הפורום  
  3. אתה יכול להניח שהאובייקטים שאתה מוסיף בעל אינטרפייס  
בתגובה להודעה מספר 0
 
משותף?
אם כן, אז המימוש כרגיל תוך ביצוע Upcasting אל האינטרפייס.

גם אם לא - לא קריטי.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   22:47   23.03.10   
אל הפורום  
  4. כל רשימה מקושרת (יהיו 2 או 3 בתרגיל הזה) תהיה מסוג אחיד  
בתגובה להודעה מספר 3
 
אבל כל רשימה שונה מהאחרות...
כלומר, המצביע מ-node יצביע כל פעם אל מחלקה אחרת בכל רשימה, אבל בתוך אותה רשימה, כל המחלקות הם מאותו סוג...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   00:17   26.03.10   
אל הפורום  
  17. לא צריך upcasting אפילו... הכל מתבצע Implicit  
בתגובה להודעה מספר 3
 
   בשביל זה יש פונקציות וירטואליות הרי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:55   26.03.10   
אל הפורום  
  19. בסוף מימשתי את זה בצורה גנרית,  
בתגובה להודעה מספר 17
 
אבל הקומפיילר של ויז'ואל "צועק" עליי אם אני לא עושה קאסטינג מפורש...

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   22:59   23.03.10   
אל הפורום  
  5. יש כמה שיטות לטפל בבעייה הזאת  
בתגובה להודעה מספר 0
 
   דבר ראשון אני לא מבין למה אתה צריך מחיקה כמשהו שהמחלקה תממש ?
רשימה מקושרת יכולה למחוק איברים מבלי לדעת מה הטיפוס שבתוכה.

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   23:15   23.03.10   
אל הפורום  
  6. תשובה  
בתגובה להודעה מספר 5
 
למה מחיקה? כי אחרת איך אפשר למחוק מבנה\class מורכב שחלק מהשדות שלו הוקצו בצורה דינמית? (הדיסטרקטור יטפל בזה? איך?)
השוואה:
לא צריך ממש פונקציית השוואה, אלא רק פונקציה שתגיד לי אם שדה מסוים זהה לשדה מקביל באובייקט מאותו סוג.
פונקציה גלובלית? יש מצב.
אבל אז אני אצטרך לאפשר גישה לשדות שהגדרתי פרטיים, והם יהפכו לציבוריים (וזה יגרע נקודות מהציון אם זה לא נצרך)

ולגבי templates... הה? רק התחלתי ללמוד OOP, אני שנה ראשונה, ודי בתחילת סמסטר ב'.
זה התרגיל הראשון שלנו, ודי הלכתי לאיבוד...
נושא התרגיל הוגדר כ:
classes, constructors & destructors


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:42   23.03.10   
אל הפורום  
  7. כמה נקודות חשובות  
בתגובה להודעה מספר 6
 
   שאתה מגדיר ADT (רשימה במקרה שלך) היא לא אמורה להיות אחראית למחוק את ה DATA של הנתונים שמאוחסנים בה !
קח כדוגמא את STL (כל מבני נתונים שהוא) ותראה שאתה עושה remove התוכן של האיבר הפנימי לא נמחק.
ובכל מקרה גם אם אתה רוצה למחוק את האיברים הפנימיים ה DTOR יקרא בכל מקרה.

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

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:17   24.03.10   
אל הפורום  
  8. אני לא בטוח שאני מבין מה זה ''friend'' או STL  
בתגובה להודעה מספר 7
 
לגבי templates, נשמע כמו משהו שילמד בקורס, וגם אם לא, אני אשמח ללמוד את זה כשאסיים עם כל המטלות לחופש.

בכל אופן, זה התרגיל:
http://u.cs.biu.ac.il/~89-111/Exercises/class1.pdf

ונאמר לנו שאנחנו חייבים ליישם Generic ADT של רשימה מקושרת.

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

תודה רבה רבה!!!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   00:44   24.03.10   
אל הפורום  
  9. אין בעד מה  
בתגובה להודעה מספר 8
 
   אני חושב ששוב , הרשימה לא אמורה למחוק את התוכן של האיבר.
תחשוב גם על מקרה שאתה מגדיר איזה int שהוקצה על ה stack ומעביר את הפוינטר שלו לרשימה כאיבר חדש.
ואז שאני אמחק אותו אני אקבל תעופה.
אתה אמור לנהל את המחיקות הפיזיות של ההקצאות מבחוץ .
וכדי למחוק את האיברים עצמם בצורה הכי יעילה שיש אני ממליץ לך להשתמש ברשימה דו מקושרת ולא בחד מקושרת כמו שאתה משתמש עכשיו.

עכשיו לגבי ההשוואה
אם עדיין אתם לא יכולים להשתמש ב friend
(אני מאד ממליץ לקרוא - זה מאד קצר בניגוד לשאר הדברים שזרקתי פה
http://msdn.microsoft.com/en-us/library/465sdshe%28VS.80%29.aspx)

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

אתה חייב שהפונקציה תהיה גלובלית או סטטית כי מאחורי הקלעים שאתה קורא לפונקציה ששייכת למחלקה המחלקה עצמה נשלחת לפונקציה (זה בעצם ה this).

שיהיה בהצלחה - אם יש עוד שאלות תרגיש חופשי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   16:01   24.03.10   
אל הפורום  
  10. תודה, שאלה נוספת.  
בתגובה להודעה מספר 9
 
עברתי שוב על התרגיל, וראיתי שהם כן רוצים שפונקציית ההשוואה תהיה מתודה פנימית של מחלקה:

אם ככה, איך באמת אני אמור ליישם את זה?

אגב, בקשר ל-template - אסור להשתמש.
העלו קובץ FAQ לאתר הקורס, ומישהו כבר שאל את זה.
בקשר ל-friend, אני אברר אם מותר.

http://u.cs.biu.ac.il/~89-111/Exercises/class1_FAQ.pdf

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   20:11   24.03.10   
אל הפורום  
  11. אתה בטוח שהם רוצים שהרשימה שלך תהיה ממוינת ?  
בתגובה להודעה מספר 10
 
   לא קראתי את כל התרגיל אבל רפרפתי בחלק של הרשימה ולא מדובר על מיון כדרישה.

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


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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   20:49   24.03.10   
אל הפורום  
  12. היא לא צריכה להיות ממוינת.  
בתגובה להודעה מספר 11
 
ההשוואת מיקום היא רק עבור בדיקה אם כבר הייתי במיקום זהה בעבר.
בעצם, הרשימה המקושרת שומרת לי את היסטוריית המיקומים שעברתי בהם.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   21:00   24.03.10   
אל הפורום  
  13. אז למה אתה צריך להעביר לרשימה פונקצית השוואה?  
בתגובה להודעה מספר 12
 
   אתה יודע לקבל איבר i נתון ואתה יודע מבחוץ מה הרשימה שלך מכילה
אז למה לא לעשות את ההשוואה מחוץ לרשימה ?
זה לא נכון להעביר לADT פונקצית השוואה אם המטרה היא לא מיון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   21:22   24.03.10   
אל הפורום  
  14. איך נשמע פתרון כזה?:  
בתגובה להודעה מספר 13
 
מכיוון שהרשימה המקושרת מחזיקה בתוכה אובייקטים מסוג מיקום, אחת המתודות שאני אכתוב לאובייקט מהסוג הזה, תהיה השוואה מול אובייקט אחר.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:27   24.03.10   
אל הפורום  
  15. אתה מתכוון לאובייקטי מיקום ? אם כן אז זה סבבה  
בתגובה להודעה מספר 14
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   00:16   26.03.10   
אל הפורום  
  16. אם הבנתי אותך נכון  
בתגובה להודעה מספר 0
 
   אז הפתרון הכי טוב יהיה לעשות משהו סטייל Interfaceים.
תיצור מחלקה שנקראת ILinkedList או משהו, תגדיר בה את הפונקציות שאתה רוצה כpure virtual, ותדאג שכל האובייקטים שאתה מתכנן שיכולים להכנס לרשימה המקושרת ירשו ממנה ויממשו את הפונקציות האלה
משם והלאה זה פולימורפיזם בפרצוף שלך


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:53   26.03.10   
אל הפורום  
  18. הלוואי והייתי יכול לעשות את זה. אסור  
בתגובה להודעה מספר 16
 
אני צריך לממש את זה the hard way...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net