עוד שאלה

matliv

New member
עוד שאלה

#include <iostream.h> class Ccomplex { public: float real; float imaginary; Ccomplex(); //constructor for known numbers Ccomplex(short a) {real=0; imaginary=0;}; //constructor for calculated numbers Ccomplex operator + (Ccomplex a); void show_num(); }; Ccomplex::Ccomplex() { cout<<"\ninsert the real part: "; cin>>real; cout<<"insert the imaginary part: "; cin>>imaginary; } Ccomplex::eek:perator+(Ccomplex a) { Ccomplex temp(1); temp.real=real+a.real; temp.imaginary=imaginary+a.imaginary; return temp; } void Ccomplex::show_num() { cout<<"\nThe number is: "<<real<<"+"<<imaginary<<"i\n"; } int main() { Ccomplex num1, num2; Ccomplex num3(1); num3=num1.operator+(num2); num3.show_num(); return 0; }​
כמו שבטח ניחשתם, זה אמור לסכם שני מספרים מרוכבים. שאלות: 1. למה זה לא עובד. 2. אני יודע שכדי להפעיל את הפונקציה של האופרטור יכולתי לכתוב גם num3=num1+num2. אבל אם אני כותב ככה, איך הוא יודע שה + הוא member של האובייקט num2? כי הוא מופיע לפניו? זו פשוט צורת רישום מקוצרת? 3. הייתי זקוק לשני constructors, הבעייה היא שלמעשה באף אחד מהם אין לי צורך בפרמטרים, אז כדי להבדיל ביניהם הוספתי פרמטר (short) שלמעשה אין לי צורך בו. יש דרך יותר אלגנטית לעשות את זה? תודה רבה!
 

annefan

New member
יאללה בלגן!

1. השתמש ב-iostream וב-using namespace std 2. למה לך שני קונסרקטורים? 3. אתה לא מחזיר סוג נכון מאופרטור + (int במקום Ccomplex) 4. הקומפיילר לא צועק לך על שום דבר?
 

matliv

New member
בסדר...

1. השימוש ב-using namespace std ממש יקבע אם הדבר הזה יעבוד? חשבתי שזה מתחיל להשפיע רק כשמתחילים למזג הרבה תוכניות. 2. מבחינת שני הקונסטרקטורים, לפי דעתי הדלה אני בהחלט זקוק לשניהם, כי אם לא יהיה לי את הקונסטרקטור עם ה-short אז כאשר אני אצהיר ב-main על num3, הוא יבקש ממני להכניס את הערכים הממשי והמדומה שלו, שזה דבר מטופש לגמרי, הרי הוא אמור לחשב אותו! 3. עכשיו נדמה לי שאני מבין את מה שאתה אומר. הטעות היא במימוש של האופרטור + . במקום לכתוב (Ccomplex::eek:perator+(Ccomplex a הייתי צריך לכתוב (Ccomplex Ccomplex::eek:perator+(Ccomplex a . נכון? 4. למעשה הוא מודיע על error בודד... מה שבטוח זה שהוא לא מפעיל אותו. ושוב תודה!
 

matliv

New member
למעשה, עכשיו כשתיקנתי

את מה שאמרת לי, ושיניתי את סוג ההחזרה של אופרטור +, הוא עובד. (תודה רבה!) אבל הסעיפים 1 ו-2 מההודעה הקודמת עדיין רלוונטיים. כלומר אני חושב שאני זקוק לקונסטרקטור השני, ואני גם חושב שאני עושה את זה בדרך מאוד לא יפה. אז יש פתרון?
 

annefan

New member
אתה צריך קונטרקטור אחד

שנראה ככה:
Ccomplex(int real=0, int img=0) : real_(real), img_(img) {}​
מה שזה אומר, זה שאם אתה לא מעביר לא פרמטרים, הם שוים ל-0, ואח"כ הקונסטרקטור מאתחל את משתני המחלקה לערכים האלה (אפסים, אם לא העברת כלום, ערכים אחרים אם כן העברת.
 

matliv

New member
אהה. לא היה כתוב על זה כלום במדריך

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