שאלה על VOID* ו CSTRING

ronitt123

New member
שאלה על VOID* ו CSTRING

יש לי מחלקה שבה יש void * val;. אני צריכה פונקציות שמחזירות את הערך של VOID ושעושות לו השמה. לכל סוגי המשתנים הצלחתי חוץ מ CSTRING. למשל עבור INT:
bool CBenchParamater::vGetInt(int & a_nValue) { if(!bIsInt()) return false; a_nValue = *(int*)val; return true; } bool CBenchParamater::vSetInt(int a_nValue) { if(!bIsInt()) return false; *(int*)val=a_nValue; return true; } ב CSTRING הצלחתי רק ע"י NEW, אך אז אין איפה למחוק את הזכרון שהקציתי. מישהו יכול לעזור לי בבקשה?​
 

annefan

New member
איך את יודעת לאיזו פונקציה לקרוא?

אם יש לך if, למה שלא תעשי cast בלי פונקציה? בכלל זו נראית לי בעיה ש-template יפתור לך ברוב המקרים. למקרים שלא, תגדירי template specialization ספציפי לו. (כדאי שתעלי גם את הקוד שמשתמש בפונקציות שהראית) חוץ מזה מה הקשר ל-NEW?
 

ronitt123

New member
תשובה

אני לא בטוחה שהבנתי. יש לי: private: void * val; לכן אני חייבת פונק' ולא יכולה לעשות CAST בלי פונק.
 

annefan

New member
תני לראות אם הבנתי

יש לך במחלקה את val שהוא private. ה-val הוא void *, כלומר יכול לייצג כל טיפוס. שתי הפונקציות שהראית הן ה-accessors שלו, ואת רוצה "ליצא" אותו החוצה רק כ-int או כ-CString? נכון עד כאן?
 

annefan

New member
אני עדיין לא מבין עד הסוף

להבנתי יש שתי בעיות. אחת, אני מקוה שאת לא עומדת לכתוב get/set לכל טיפוס... השניה, ל-CString יש כל מיני דרעקים בפנים שאני לא מבין עד הסוף. הנה מחלקה של כלום עבודה שעושה את מה שאת צריכה לטיפוסים הנורמליים, ול-CString:
class C { void * val; public: C() { val = new char[255]; } ~C() { delete [] val; } template<typename T> bool get(T & t) { t = *(T *)val; return true; } template<> bool get(CString & t) { t = CString((char*)val); return true; } template<typename T> bool set (T t) { *(T *)val = t; return true; } template <> bool set (CString t) { strcpy((char*)val, (const char *)t); return true; } };​
כמובן שתצטרכי לטפל יותר טוב בהקצאת הזכרון. סביר להניח שיש הרבה אופטימיזציות שאפשר לעשות, אם לומדים את CString לעומק. אבל המחלקה הזו עובדת עם הקוד הבא:
C c; c.set(3); int num; c.get(num); cout << num << endl; double dnum; c.set(2.3333); c.get(dnum); cout << dnum << endl; { CString cstr("annefan"); c.set(cstr); } CString cstr2; c.get(cstr2); cout << cstr2 << endl;​
בהצלחה!
 
למעלה