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

נושא: CPP: בעיה עם downcast ו-auto_ptr

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 03 November 2006 בשעה 15:46 | IP רשוּם
ציטוט אלצ'קו

מכל מיני סיבות, יש לי מצב כזה בערך: מחלקת בסיס B שממנה יורשות מחלקות D1, D2, D3, וכו'. ליתר דיוק, יורשת תבנית מחלקה, אבל זה לא משנה מהותית את הבעיה. משהו כזה:
קוד:
class B {
    B() = 0;
    ~B();
    std::string getTypeName();
}

template <typname T>
class D : public B {
    D();
    ~D();
    std::string getTypeName();
    void setVar (const T& newVal);
    T getVar();
}


המטרה של כל העסק היא לשמור רשימה של פריטי מידע מסוגים שונים. משהו כזה:
קוד:
std::vector<B*> myVec;


כדי להשתמש ב-getVar או ב-setVar צריך לעשות dynamic_cast לטיפוס המתאים (שאותו מגלים בעזרת getTypeName), ואז לבצע getVar/setVar.

עד פה הכל טוב, חוץ מזה שיש לי המון מצביעים "ידניים". הפיתרון המובן מאליו הוא להשתמש ב-auto_ptr (או ב-shared_ptr, אם כבר) ושלום על ישראל. מובן מאליו שהפיתרון המובן מאליו לא פועל, כי auto_ptr< D<int> >‎ או auto_ptr< D<std::string> >‎ לא יורשים מ-auto_ptr<B>‎ (הם unrelated types). כלומר, אי אפשר לעשות dynamic_cast מה-auto_ptr שיש לי ל-auto_ptr לטיפוס האמיתי.

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

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

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

יש הצעות?
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 

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

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

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