נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: בעיה בגישה למשתנים פרטיים

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
אורח
אורח
אורח


הצטרף / הצטרפה: 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 רשוּם
ציטוט Fate

אני לא כזה גאון בC++ במיוחד כשזה מגיע לTemplates וכאלה...
אבל יש לי הרגשה שאתה צריך להגדיר את הפונקציה לא כPrivate אלא Protected.
ואז מי שיורש יוכל לגשת...
חזרה לתחילת העמוד הצג את כרטיס החבר של Fate חפש הודעות אחרות של Fate
 
אורח
אורח
אורח


הצטרף / הצטרפה: 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 רשוּם
ציטוט אלצ'קו

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

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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