לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

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



  #1  
ישן 06-06-2008, 17:57
  AvivHa AvivHa אינו מחובר  
 
חבר מתאריך: 12.08.06
הודעות: 17
שאלה ב C++ (ירושות,פולימורפיזם)

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

אני יתאר את הקוד שכתבתי, ואיפה מופיעה הבעיה

יש לי 3 מחלקות: Item,A,B
ב - Item יש לי כמה משתנים (תחת private) וכמה פונקציות מסוג void (תחת public
A,B יורשים מ Item:
class A: public Item
class B: public Item
לכל אחת מהמחלקות יש פונקציות ומשתנים משלהם.

ב - A,B יש לי קונסטרקטור, שמפעיל את הפונקציות שירשתי מ-Item וגם מפעיל פונקציות שנמצאות באותה המחלקה.

עד לכאן הכל עובד כמו שצריך.

עכשיו עשיתי מחלקה נוספת - Store, בתוך המחלקה הזאת אני רוצה מערך בגודל 10 של מצבעים ל - Item.
קוד:
#ifndef _STORE_ #define _STORE_ #include "Item.h" class Store { Item* arr[10]; public: Store(Item* x) { arr[0]=x; } }; #endif


ב- main עשיתי דבר כזה:
קוד:
#include <iostream.h> #include "Item.h" #include "A.h" #include "B.h" #include "Store.h" void main() { Item* x=new A; Store(x); }

כאשר אני מגדיר את x שיצביע ל A אכן נוצר לי x חדש מסוג Item ופועל הקונסטרקטור של A.

2 בעיות:

1.אותם ערכים שהתקבלו כתוצאה מהפעלת הפונקציות של - A אינם נשמרים לי ב- x, x בעצם מקבל רק את הערכים שקימים ב- Item, אבל מה עם אותם ערכים שקימים ב-A?
איך אני ניגש אליהם? ואיפה הם בעצם נשמרו?

2. בעיה נוספת היא שאני גם לא מצליח לשלוח את אותו x למחקלה Store, שבה יש לי את מערך המצביעים מסוג *item, למה זה קורה?

מקווה שהסברתי את עצמי טוב, תודה מראש

נערך לאחרונה ע"י AvivHa בתאריך 06-06-2008 בשעה 18:15.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 07-06-2008, 14:35
  AvivHa AvivHa אינו מחובר  
 
חבר מתאריך: 12.08.06
הודעות: 17
בתגובה להודעה מספר 4 שנכתבה על ידי yoavmatchulsky שמתחילה ב "כי המערך שלך הוא מערך מסוג..."

אוקי, מתודות וירטואליות - זה מה שאני צריך

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

כמו כן איך תראה מתודה וירטואלית שתצליח להכניס לי איברי A,B לתוך מערך מסוג Item? תודה

אני אפרט שוב את הבעיה עם תצלום מסך של הדיבאגר:
זאתי המחלקה Store -בה צריך להיות לי מערך מסוג Item* -אני צריך להכניס לתוך המערך אוביקטים מסוג CD/BOOK/DVD שהם יורשים מ-Item.
קוד:
#ifndef _STORE_ #define _STORE_ #include "Item.h" class Store { int i; Item* arr[10]; public: Store() { i=0; } CD *AddNewCd(char *name,int amount,float price) { CD x; x.CD2(name,amount,price);// This is a function in class CD, that actives functions that CD inherited from Item. return &x; } }; #endif



תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

נערך לאחרונה ע"י AvivHa בתאריך 07-06-2008 בשעה 14:54.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 07-06-2008, 15:05
  משתמש זכר yoavmatchulsky yoavmatchulsky אינו מחובר  
 
חבר מתאריך: 15.08.06
הודעות: 1,561
שלח הודעה דרך ICQ אל yoavmatchulsky שלח הודעה דרך MSN אל yoavmatchulsky Facebook profile
בתגובה להודעה מספר 5 שנכתבה על ידי AvivHa שמתחילה ב "אוקי, מתודות וירטואליות - זה..."

דבר ראשון, אתה לא תראה רשימות מתודות בדיבאגר. דיבאגר מראה רק שדות נתונים.

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

קוד:
class Item { ... virtual void play() = 0; } class CD : Item { virtual void play() { cout << "i am a now palying a cd"; } } class DVD : Item { virtual void play() { cout << "i am now playing a DVD"; } }

* תסלח לי אם הסינטקס לא הכי נכון, לא התעסקתי בC++ כבר כמה סמסטרים

עכשיו אתה תוכל על כל איבר במערך להפעיל את play() והוא יפעיל את הפונקציה הוירטואלית שלו בהתאם לאיזה אוביקט הוא באמת.
_____________________________________
!!אזהרה!!
ההודעה עלולה להכיל שברי אגוזים ו/או איברי דגים כלשהם
!!אזהרה!!

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 06:47

הדף נוצר ב 0.04 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר