פוינטר ריק...

yair24

Member
פוינטר ריק...

שלום, אני צריך לעשות מחלקה ולהשתמש בה כמה פעמים, אבל פעם אחת אני צריך מופע דומה שיש בו עוד יכולת שאין במופעים הראשונים שהזכרתי. (זאת אומרת שאני צריך מנגנון שדומה לירושה) אני צריך לחשוב על דרך לממש את זה בC. חשבתי להוסיף עוד שדות למחלקה, שדות שיהיו קשורים ליכולת שאני צריך ולהשתמש בשדות האלה רק במופע המיוחד, ובשאר המופעים פשוט להתעלם מהם. אבל אז זה יוסיף לי נתונים לכל המחלקות ויבזבז מקום בזכרון וגם צורת התיכנות הזאת לא טובה... רעיון אחר שחשבתי עליו זה להוסיף למחלקה הראשונה שהזכרתי פוינטר שמצביע על מחלקה אחרת (המחלקה האחרת תממש את היכולת המיוחדת שאני צריך) ולהשתמש בפוינטר רק במופע שבו אני צריך את היכולת המיוחדת ובשאר המופעים לשים בו NULL, זה כבר יותר טוב מהרעיון הקודם, אבל עדיין לא מושלם. יש למישהו רעיון יותר טוב איך לדמות ירושה בC? הרעיון צריך להיות גם חסכוני במקום (פוינטר שמצביע לNULL תופס מקום נכון?) וגם יפה ונוח מבחינה תכנותית (יש דבר כזה?) כל עזרה תתקבל בתודה... יאיר
 

jgut

New member
אפשרות

את המחלקה בלי הדברים שצריך תגדיר בתור מחלקה אחת. המלקה עם הדברים הנוספים תגדיר בנפרד כשהיא מכילה את המלקה הראשונה. לדוגמא:
typedef struct _A { int a; }A, *PA; typedef struct _B { A; int b; }B, *PB;​
והקריאות נראות כך:
int main(int argc, char* argv[]) { A aa; B bb; aa.a = 0; bb.a = 0; bb.b = 1; return 0; }​
 

yair24

Member
לא...

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

jgut

New member
אין לך את אותה בעיה בירושה ב- C++?

הרבה זמן לא תכנתתי ב- C++ אבל ממה שאני זוכרת גם שם אתה מחזיק רשימה מקושרת של מחלקת האב. ואתה צריך לדעת אים אתה פונה לפונקציות שקיימות רק אצל הבן איזה מחלקה אתה (כדי לא לפנות אלהם כשאתה מחלקת האב). הפתרון שנתתי דומה לירושה public כשאין פונקציות וירטואליות. הבעיה האמיתית לדעתי היא לממש ירושה בפונקצות וירטואליות. אבל גם את זה אפשר לפתור.
 

yair24

Member
אני לא חושב שבC++ יש את הבעיה

הזאת. אני שם רשימה מקושרת של מחלקת האב ומממש פולימורפיזם. וככה כשאני קורא לפונקציה מסוימת הפונקציה שמתממשת היא כתלות באיבר שהפוינטר מצביע עליו כרגע. יכול להיות שמהשאלה הקודמת לא הבנת את הכוונה של מה שהייתי צריך ואין לי אפשרות להשתמש בC++ כי הקומפיילר שלי לא תומך בזה (לא הTC3) אבל מה שאני צריך זה בעצם לממשפולימורפיזם ולא ירושה. אני משתמש בפוינטרים לפונקציות בשביל לממש את זה. יאיר
 
זה דוקא פתרון נחמד

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

yair24

Member
מעניין

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

jgut

New member
כן לפחות ב- MSDEV

אני השתמשתי בזה הרבה פעמים ב- C, כשהייתי צריכה לעבוד עם דברים שהיה יותר נכון לתכנן אותם ב-C++. על מה הקומפיילר צועק לך?
 

yair24

Member
אוי באמת...

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

The_Mighty_Perr

New member
אוי באמת...

בס"ד אוי באמת... אולי חשבת שהשאלה מתייחסת להאם מדובר ב-type או typedef? לא... עדיף היה להשמיץ... טוב... אל תענה... אני לא רוצה לדבר איתך!
 

yair24

Member
היי היי תרגע ../images/Emo13.gif

פשוט זכור לי איזה ויכוח שהיה לך פה עם מישהו וזה הגיע גם לז*ונ*ם זה הכל... מדובר פה בTYPEDEF. אני לאיודע מה זה TYPE. ולא התכוונתי להשמיץ אף אחד... יאיר
 

ihovav

New member
קודם כל תרגעו

אין שום כוונה להתחיל פה שרשור חדש של "שופוני אנס" וכ"ו לגבי השאלה : כתבתי פעם פרוייקט צייר גראפי ב C - והיו בו כמה וכמה צורות : נקודה, קו, מרובע ופוליגון - שהמשותף לכולן היא כמובן הנקודה מה שעשיתי זה שיצרתי אובייקט מסוג "צורה" והחלתי בפנים את כל מה שמשותף (פוינטרים גנריים לפונקציות וכ"ו) וגם רשימה מקושרת של נקודות. ככה לא היה בזבוז מקום מיותר ויכולתי להכניס את כולם לרשימה מקושרת של "צורות" ולהפעיל פונקציות עליהם מבלי להזדקק ל CASTING או לפונקציות מיוחדות (הפוינטרים לפונקציות אותחלו ביצירה לפי סוג הצורה המבוקשת) זה מה שאני מציע לך לעשות
 

IdanR

New member
חחח.. חובב..

אהבתי את ה signature שלך.. זה משעשע אותי כל פעם מחדש.
 

The_Mighty_Perr

New member
נרגעתי

בס"ד 1. לא הגיע לז**נ*ם, אבל היה לא נעים... 2. התכוונתי האם מדובר ב-TYPEDEF או ב-STRUCT? 3. אוקיי...
בברכה...
 

yair24

Member
מדובר בTYPEDEF STRUCT...

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