עבור לתוכן

העמסת אופרטורים

Featured Replies

פורסם

אני רושמת תוכנית המקבלת נתוניןם מהמשתמש ואז עפ"י בחירתו מחשבת חישובים.

יש אפשרות להגדיר את האורפטורים > , < וכו' ושהמשתמש יבחר באיזו פונקציה להשתמש??

לדוגמא:


class student
{
int math;
int eng;
}

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

(פעם אחת ימיין לפי מתמטיקה> אנגלית, ופעם אחרת להפך?)

איך המחשב יודע באיזה אופרטור לבחור?

פורסם

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

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

פורסם

החוקים של overload resolution של C++ הם מסובכים מאוד, למרבה הצער.

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

במקרה זה עדיך שפשוט תגדירי:


struct grades
{
int math;
int eng;
};

bool EngGT( const grades& a, const grades& b )
{
return a.eng > b.eng;
}

bool MathGT( const grades& a, const grades& b )
{
return a.math > b.math;
}

וכו'.

אםשר גם להשתמש ב-templates ולקבל דברים מעניינים:



inline int Eng( const grades& x ) { return x.eng; }

inline int Math( const grades& x ) { return x.math; }

template <typename FIELD_GETTER, typename PRED>
inline bool Compare( const grades& a, const grades& b, FIELD_GETTER getter, PRED pred )
{
return pred( getter(a), getter(b) );
}

int f()
{
grades x,y;
//...
if ( Compare( x, y, Eng, std::gt ) )
{
// we know x.eng > y.eng
// ...
}
};

אבל אני מסופק שזה הפתרון המתאים במקרה שלך.

פורסם
  • מחבר

לא הבנתי מה עשית, (מה זה ה const & הזה?)

מנסה לחדד את השאלה: באקסל יש אפשרות לפי מה לסדר את הנתונים- האם אפשר להגדיר ככה את האופרטור שהמשתמש יבחר כיצד יוגדר האופרטור?

פורסם

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

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

פורסם

או שאני לא הבנתי מה שאלת, או שכל אלה לפני לא הבינו.

את שואלת אם אפשר לגרום להתנהגות של האופרטורים של ההשוואה להשתנות תוך כדי ריצה.

התשובה היא - כן, אבל זה רעיון רע.

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

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

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

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים