מסתבך עם NEW ב++C

eyalamado

New member
../images/Emo53.gifמסתבך עם NEW ב++C

ערב טוב, יש לי תרגיל ב++C שיש בו 2 מחלקות CLASS:
class CPoint { public: CPoint(int x,int y); CPoint(const CPoint& p); private: int m_x; int m_y; }; class CArray_Point { public: CArray_Point(); CArray_Point(int size); CArray_Point(const CArray_Point& ap); private: CPoint* vec; int size;; };​
עכשיו יש לי בעיה במימוש הבא:
CArray_Point::CArray_Point(int size) { if(size>0) { vec=new CPoint[size]; //
} }​
איך אני מאתר מערך חדש כאשר אין לי default constructor
תודה לכולם
 

eyalamado

New member
המורה שלי...

נתן לנו את התרגיל הזה בכוונה בלי default constructor... אני גם לא יודע איך לעשות זאת... הדרישה שלו לבנות 2 מחלקות: 1)מחלקת נקודה (בלי default constructor) 2)מחלקת מערך דינמי של נקודות
 

vinney

Well-known member
אבל הוא לא אמר להקצות מראש, נכון?

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

eyalamado

New member
לא ממש הבנתי אותך אבל...

במחלקה של המערך יש כפי שאתה רואה בהודעה הראשונה שלי שיש שם את המאפיין:
CPoint* vec;​
עכשיו שאני רוצה ליצור אובייקט חדש מסוג המחלקה הזה אז או שאני מאתחל עם ערכים או בלי. כאשר אני מגדיר:
CArray_Point Ap(100);​
אז עכשיו צריך לבצע הקצאה דינמית לאותו מצביע ולבצע איתחול של כל אחד מהאיברים בעזרת פרמטר קונסטרקטור אבל אי אפשר לבצע פה רשימה מקושרת או משהו כזה... אם זה היה הקצאה של נקודה אחת אז לא היה בעיה לאתחל אותה ישירות אבל מה בנוגע למערך
אז:
vec=NULL;​
אך מה אני עושה כאשר אני רוצה להגדיר אובייקט חדש עם נתונים(גודל המערך):
CArray_Point Ap();​
 

vinney

Well-known member
לא הבנתי כלום

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

eyalamado

New member
המימוש של המחלקה לא שלם...

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

vinney

Well-known member
ויש לך copy constructor?

איך אתה תחליף מערכים התחלתיים לערכים שהמשתמש נותן לך?
 

eyalamado

New member
המחלקה לא מלאה../images/Emo70.gif../images/Emo70.gif

class CArray_Point { public: CArray_Point(); CArray_Point(int size); CArray_Point(const CArray_Point& ap); CArray_Point operator+(const CArray_Point &ap); CArray_Point operator+(const CPoint &p); CArray_Point operator++(int);//post CArray_Point operator++();//pre CArray_Point operator--(int);//post CArray_Point operator--();//pre CArray_Point& operator=(const CArray_Point &ap); CArray_Point operator+=(const CArray_Point &ap); bool operator==(const CArray_Point &ap); bool operator!(); CPoint& operator[](int position); CPoint pop(); //I/O friend ostream& operator<<(ostream& o,const CArray_Point &ap); friend istream& operator>>(istream& i,CArray_Point &ap); private: CPoint* vec; int size;; };​
עכשיו מובן יותר
 

vinney

Well-known member
כן

לגבי הsize - מאפיין זה מופיע בכל מערך דינמי מכבד את עצמו, והרעיון הוא בהקצאת בלוקים בגודל מסוים, ולא לכל איבר שמוכנס. במקרה שלך אגב, יש ctor, פשוט לא שמתי לב, אבל הקצאה ב[] אתה לא תוכל לעשות, תצטרך לעשות הקצאה עבור כל איבר בנפרד עם ערכי איפוס (כי הרי אין לך dtor), כך שהsize מאבד לחלוטין מהמשמעות שלו, ואין בו שום צורך במקרה הזה.
 
למעלה