עבור לתוכן

שאלה בקשר לTAMPLATE בC++

Featured Replies

פורסם

שלום

יש לי בעיה בהקצאת מחלקת TEMPLATE חדשה


נתון לי מחלקה
template<int size> class a
ועכשיו יש לי פונקציה שמקבלת גודל
a בתור פרמטר
וצריכה להקצות מחלקה חדשה

ניסיתי ככה אבל זה לא עבד
A<a> *test = new A<a>;

תודה

פורסם

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

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

פורסם

djdodo: למה התכוונת ב-

A<a>

?

הרי לא הגדרת כזה class.

פורסם
  • מחבר

אני אנסה לפרט קצת

יש לי מחלקה בשם A

שהיא מסוג TEMPALTE שאמורה בעת היצירה לקבל פרמטר של גודל בתוך הסוגריים של TEMPLATE

כלומר היא מוגדרת ככה


template<int size>
class A
{...};

עכשיו יש לי מחלקה שניה בשם B שהיא לא TAMPLATE שמשתמשת במחלקה A

מחלקה B מקבלת בCONSTRACTOR פרמט של גודל

והבעייה שלי שאני צריך ליצור בתוך המחלקה B מחלקה A באותו הגודל (שמקבלים בCONSTRACOR)

וזה יוצר לי בעייות כי A היא TAMPLATE

ככה זה נראה


class B{
public:
B(int size);
...
private:
A<???> test;
}

מה אני אמור לכתוב במחלקה B במקום הסימני שאלה (שם אמור להיות גודל כלשהו שאני לא יודע אותו עד ליצירת המחלקה B)

בבקשה תעזרו לי

פורסם

כמו שאמרתי, אי אפשר לעשות את זה, אתה צריך לדעת את הפרמטר בזמן קומפילציה. A חייבת להיות Template?

פורסם
  • מחבר

כן A חייבת להיות TEMPLATE

שאלה אחרת אז.

איך אני עושה casting למחלקה שהיא TEMPLATE

לדוגמא יש לי


void* ptr;
const int i = 100;
ptr = new A<i>;

איך אני עושה שptr יהיה מצביע למחלקה A בגודל 100

ניסיתי ככה אבל זה לא עבד


ptr = (*A<i>)ptr;

תודה

פורסם

אתה צריך להבין משהו - instance של template, למשל a<100> הוא class בפני עצמו. אין שום קשר בין a<100> לבין a<90>.

אם יש לך class או פונקציה שמשתמשים ב- template, גם הם צריכים להיות מוגדרים כ- template (יש לך אפשרות לעקוף את זה אם ה- template שלך יורש מ- class שמגדיר ממשק משותף).

בדוגמא שכתבת אתה לא יכול לעשות

new A<i>

כי ה- instance class של A נוצר ב- pre-compile, עוד לפני שהערך של i מחושב.

האפשרויות היחידות שלך להחזיק typed pointer למשתנה שהוא template הן או ע"י מצביע לאותו class בדיוק, כלומר

A<100>* ptr = new A<100>;

או ע"י מצביע ל- parent class של A.

אגב, את מה שאתה מנסה לעשות עם B ו- A אי אפשר לעשות ב- C++. נראה לי שאו שלא הבנת מה אתה צריך לעשות, או שמי שנתן לך לעשות את זה לא מבין מהחיים שלו.

פורסם

מנגנון ה template ב C++ הוא מנגנון של זמן קימפול, כל הקוד של ה template מקומפל לקוד אמיתי בשפת C++ בזמן שמשתמשים בפועל במופע אמיתי ומוגדר שלו בקוד.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים