כותב |
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 01 September 2006 בשעה 06:34 | | IP רשוּם
|
|
|
|
קוד:
template <typename T> class List { private: Node<T>* pHead;
public: List(); ~List(); void Insert(T); void Show() const;
class Iterator; };
//////////////
template <typename T> class List<T>::Iterator { private: Node<T>* theNode;
public: Iterator() { theNode=pHead; } ~Iterator() { delete theNode; theNode=0;
// .. Operators.. }; |
|
|
למה אני לא יכול לגשת בבנאי של ה Iterator למשתנה הפרטי ? אם אני מנסה להגדיר את זה כמחלקה חברה זה לא יעבוד כמו שאני רוצה. (חברה = Friend כי בעיקרון אני מגדיר את המחלקה כחברה = member) אז זה כן יצליח לגשת למשתנה, אבל אני אצתרך להפוך את iterator למחלקה עם תבנית וזה לא אמור לעבוד ככה.. איך אני אמור לפתור את הבעיה?
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 02 September 2006 בשעה 00:19 | | IP רשוּם
|
|
|
|
I COULD REALLY USE SOME HELP ?
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 02 September 2006 בשעה 09:53 | | IP רשוּם
|
|
|
|
פניתי אליו כאל משתנה פרטי אחרי הכול, המחלקה List חברה (member) של Node. אז כנראה שזה לא אפשרי.. אז ניסיתי להגדיר אותה כחברה (friend) אבל מתי שאני מגדיר אותה כ Friend צריך להגדיר גם תבנית חדשה וככה זה לא אמור לעבוד לפי הList הסטנדרטי, אחרי הכול אני כותב את זה בשביל לחקות את המחלקה List הסטנדרטית.
|
חזרה לתחילת העמוד |
|
|
Fate פורומיסט על
הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת הודעות: 571
|
נשלח בתאריך: 02 September 2006 בשעה 12:52 | | IP רשוּם
|
|
|
|
אני לא כזה גאון בC++ במיוחד כשזה מגיע לTemplates וכאלה... אבל יש לי הרגשה שאתה צריך להגדיר את הפונקציה לא כPrivate אלא Protected. ואז מי שיורש יוכל לגשת...
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 02 September 2006 בשעה 17:19 | | IP רשוּם
|
|
|
|
לא לא לא זה לא אמור לעבוד ככה! לא צריכים להוריש מהמחלקה, צריכים לעשות אותה כחברה בשביל לגשת אליה ככה: List<T>::Iterator כמו שזה אמור להיות בספריה ה LIST הסטנדרטית, טוב נו כנראה שאני אצתרך לחכות לתשובה של אלצקו :/
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג2ר פ33תי
הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת הודעות: 609
|
נשלח בתאריך: 02 September 2006 בשעה 21:10 | | IP רשוּם
|
|
|
|
לצערך, זה לא חוקי. היגיון פשוט היה אומר שבגלל שהמחלקה Iterator חברה
בתוך (member) המחלקה List אמורה להיות לה גישה לכל List, כולל לאיברים
הפרטיים.
סעיף C.11.3 ב-TC++PL מבהיר שזה לא המצב. ומציע לכתוב אכן להשתמש ב-friend באופן כמו זה:
קוד:
class outer
{
private:
...
public:
friend class inner;
}
class outer::inner
{
...
}
|
|
|
קיימת הצעה
לשנות את ההתנהגות הזו (מכונה DR45 בגוגל. כלומר, סעיף 45 ב-Defect
Report), אבל למרות שהיא מ-1998, זו עדיין טיוטה. יש למה לצפות ב-C++0x.
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 03 September 2006 בשעה 14:10 | | IP רשוּם
|
|
|
|
אז איך למעשה המחלקה Iterator למעשה עובדת ? הרי היא חברה (member) במחלקה List ועדיין היא ניגשת איך שהוא לראש הרשימה..
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג2ר פ33תי
הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת הודעות: 609
|
נשלח בתאריך: 03 September 2006 בשעה 14:49 | | IP רשוּם
|
|
|
|
לא אמרת הרגע שזה לא פועל לך?
חוץ מזה, שים לפקשוש האחר, שלא קשור לעניין ה-nesting: מחלקה איננה אובייקט. זו הגדרת טיפוס (כמו struct, או typedef). בקטע:
קוד:
Iterator() { theNode=pHead;
} |
|
|
לא ממש ברור לאיזה pHead אמורים לגשת. pHead לא סטטי, ולכן אתה חייב לציין אובייקט ספציפי של-pHead שלו אתה רוצה לגשת.
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 03 September 2006 בשעה 16:41 | | IP רשוּם
|
|
|
|
התכוונתי בספריה הסטנדרטית list יש מחלקה List שבתוכה יש מחלקה חברה (member) Iterator אז רציתי להבין איך הם עושים את זה בספריה הסטנדרטית!
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג2ר פ33תי
הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת הודעות: 609
|
נשלח בתאריך: 03 September 2006 בשעה 16:52 | | IP רשוּם
|
|
|
|
בעזרת friend. הקוד של הספריה הסטנדרטית גלוי לפניך. אם יש לך מהדר
ש-compliant עם ISO CPP, פשוט תפתח את הקובץ list, ותראה בדיוק מה עשו שם.
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 04 September 2006 בשעה 16:31 | | IP רשוּם
|
|
|
|
אם זה היה בעזרת friend אז לא היה ניתן להגדיר את הטיפוס ככה:
קוד:
list<T>::iterator varName; |
|
|
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג2ר פ33תי
הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת הודעות: 609
|
נשלח בתאריך: 04 September 2006 בשעה 16:41 | | IP רשוּם
|
|
|
|
למה נראה לך שלא?
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 September 2006 בשעה 15:05 | | IP רשוּם
|
|
|
|
אוקי אז נגיד ואפשר איך אני יכול לדעת במחלקה ITERATOR איזה סוג נבחר? כי הרי אני מנסה ליצור Node<T> bla.. זה לא יתן לי בגלל שהוא לא יודע מה התבנית והiterator לא צריך לקבל תבנית לפי הסיינטקס הסטנדרטי איך אני פותר את זה?!
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג2ר פ33תי
הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת הודעות: 609
|
נשלח בתאריך: 05 September 2006 בשעה 17:24 | | IP רשוּם
|
|
|
|
אני לא מבין את השאלה, ואתה עדיין יכול להסתכל בקובץ list ולראות איך הם עשו את הדבר הזה שאתה לא מבין איך עושים.
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 September 2006 בשעה 17:32 | | IP רשוּם
|
|
|
|
תסתכל במחלקה iterator יש לה במשתנה הפרטי שמה Node<T> *theNode; עכשיו המהדר אומר לי שיש שגיאה (כי הוא לא יודע איזה סוג תבנית לבנות!) ד"א שיניתי את הכול לFRIEND אז זה נראה ככה:
קוד:
template <typename T> class List { private: Node<T>* pHead;
public: List(); ~List(); void Insert(T); void Show() const;
friend class Iterator; };
//////////////
class Iterator { private: Node<T>* theNode;
public: Iterator() {} ~Iterator() { delete theNode; theNode=0;
// .. Operators.. }; |
|
|
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג2ר פ33תי
הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת הודעות: 609
|
נשלח בתאריך: 05 September 2006 בשעה 17:40 | | IP רשוּם
|
|
|
|
נכון, כי T לא מוגדר בקונטקסט של Iterator. למה ציפית?
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 September 2006 בשעה 17:44 | | IP רשוּם
|
|
|
|
אז איך אני פותר את זה?! כדי שזה יעבוד כמו שב LIST הסטנדרטי בלי להגדיר ל iterator תבנית (כמו שבLIST הסטנדרטי לא מוגדר תבנית)
|
חזרה לתחילת העמוד |
|
|
אלצ'קו אחראי פורומים
ג2ר פ33תי
הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת הודעות: 609
|
נשלח בתאריך: 05 September 2006 בשעה 17:48 | | IP רשוּם
|
|
|
|
אני מציע לך בפעם השלישית לקרוא בעצמך מה כתוב בספריה הסטנדרטית, במקום לשחק איתי טלפון שבור.
|
חזרה לתחילת העמוד |
|
|