מערכים בC++

VBMaster2

New member
מערכים בC++

שלום, איך אני יכול להגדיל מערך שהוגדר כך: int a[]; למערך בעל 8 תאים, ולאחר מכן למערך בעל 10 תאים?
 

gmorph

New member
אתה לא

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

VBMaster2

New member
אני יודע למה אתה מתכוון.. אבל..

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

gmorphus

New member
אני יכול לתת לך התחביר

אבל אתה צריך ללמוד לעבוד באופן מסודר עם מצביעים בC++ וזה לא זהה לשפות אחרות... בכל מקרה:
int *pInt = NULL; // declare a pointer pInt = new int[8]; // allocate 8 integers pInt[3] = 7; // change the value in the 3rd integer int temp = pInt[7]; // get the value in the 7th cell delete [] pInt; // deallocate the array pInt = new int[10]; // allocate a new 10 elements array /// the following is illegal because the counting // starts with 0: pInt[10] = 5; // exception!​
 

VBMaster2

New member
אבל

אם כבר יש לי מערך עם 8 תאים ואני רוצה להגדיל אותו למערך עם 10 תאים אבל אני לא רוצה ש8 התאים שכבר קיימים ימחקו, איך אני עושה את זה?
 

zagzagzag

New member
אפשרויות

אני לא מכיר משהו מובנה בCPP. אפשרויות: 1. להשתמש ב-malloc, realloc, free שהן פונקציות מ-C. אתה יכול למצוא אותן ב-cstdlib. הבעיה היא שאתה מאבד יתרונות של CPP כשאתה עובד עם הפונקציות האלה (למשל, אם תשחרר את הזיכרון של מערך אובייקטים, לא תתבצע קריאה ל-destructor). 2. להשתמש במבני נתונים שקיימים בשפה כמו vector, שמנהל עבורך הוספת והוצאת איברים מהמבנה.
 

selalerer

New member
:

int *pInt1=new int[8]; //..... //..... int *pInt2=new int[10]; int i; for(i=0;i<8;i++) pInt2=pInt1; delete pInt1; pInt1=pInt2;
 

VBMaster2

New member
שאלה נוספת

האם ניתן ליצור פונקציה שתחזיר מחלקה? דהיינו:
mycls myfunc(void);​
? אם כן- מדוע זה לא מצליח לי?
 

zagzagzag

New member
אפשרי, תעלה לכאן את הקוד.

והפונקציה לא תחזיר מחלקה, אלא instance של המחלקה
 

VBMaster2

New member
זה קוד דיי ארוך....

אתה יכול לתת דוגמה קטנה כיצד יוצרים פונקציה שמחזירה מופע למחלקה?
 

zagzagzag

New member
דוגמה קטנה

#include <iostream> #include <string> using namespace std; string func() { string ret = "test"; return ret; } int main() { cout << func() << endl; }​
 

VBMaster2

New member
או קיי....

התכוונתי למחלקה שאני בונה... פשטתי את המחלקה שלי... הנה העיקר:
#include <iostream.h> class a{ public: int x; }; a myfunc(void){ a tmp; tmp.x=1; return tmp; } int main(void){ int i; cout << i; a t; t=myfunc; cout << '\n' << a.x; cin >> i; return 0; }​
למה זה לא פועל?
 

zagzagzag

New member
זה לא שונה מהדוגמה שלי...

הקוד שלך לא פועל כי לא קראת ל-myfunc (שכחת סוגריים), וכי אתה מנסה להדפיס את a.x כשאתה אמור להדפיס את t.x. אולי יש עוד שגיאות שלא ראיתי בכל מקרה, תסתכל על השגיאות שאתה מקבל מהקומפיילר, בדר"כ זה עובר להבין איפה הבעיה.
 

selalerer

New member
יש עוד דברים שאתה צריך לעשות מלבד

זה. כשאתה יוצר מחלקה משלך, אתה צריך ללמד אותה איך להעתיק את עצמה (בכדי שתוכל להשתמש בה בתור ערך מוחזר. את זה אתה עושה בעזרת שתי פונקציות, אופרטור = ובנאי מעתיק:
class a { private: int x; public: a(int x) { a::x=x; } //copy functions: a(a &a1) { a::x=a1.x; } void operator=(a &a5) { a::x=a5.x; } };​
במקרה הזה הקוד היחיד שמעתיק את המחלקה הוא פשוט השמה של x מתוך אובייקט המקור של העתקה אל אובייקט היעד, אך במקרים אחרים ייתכן שיכילו קוד יותר מסובך. בכל מקרה כדאי לך להיעזר בספר טוב ללימוד ++C כי אתה שואל שאלות מאוד בסיסיות שדורשות הרבה בסיס והרבה הסברים עד שמגיעים אליהם. הספר שבד"כ מומלץ כאן הוא ++Thinking in c של Bruce Eckel. בהצלחה.
 

gmorphus

New member
לא בדקתי אבל

במקרה הזה אני חושב שקומפיילר יודע לספק מנאי מעתיק בסיסי. שפשוט מעתיק את הmembers.
 

selalerer

New member
בדקתי, וכנראה שהוא כן מספק איזה

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

gmorphus

New member
לא מלא בזבל

הוא מפעיל אופרטור = או בנאי מעתיק עבור ה member variables. הוא ממש לא ממלא את בזבל... והוא גם לא סתם מעתיק את הזיכרון. תנסה למשל לשים list כאחד המשתנים של המחלקה ולראות מה קורה...
 

selalerer

New member
לא אצלי! אצלי כשאני מדפיס את החברי

מחלקה, הוא מדפיס לי זבל. גם בVC וגם ++DEV C
 
למעלה