עבור לתוכן

הי מישהו יודע איך אני יכול להגדיר פונקציה של class כ callinfunction?

Featured Replies

פורסם

הי,

יש לי פונקציה שכאחד הפרמטרים אני מכניס לה פוינטר לפונקציה מסוג void

ניסיתי לקרוא לה כשאני מכניס פונקציה שכתבתי בתוך class, אבל הקומפיילר מעיף אותי.

איך אפשר לעשות את זה?

פורסם

אני לא מכיר את הנושא הזה, אבל בוא נחשוב בצורה הגיונית:

אם הפונקציה private, אתה כבר מנסה לעקוף את מנגנון ה-OO.

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

פורסם

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

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

member functions לוקחות תמיד את ה- this בתור פרמטר חבוי.

אתה חייב לקרוא לה דרך האובייקט שלו היא שייכת (למרות שאם היא לא וירטואלית אז אתה תוכל לקרוא לה גם כשה- this הוא null, אבל אז לא תוכל לגשת לשום member variable).

אם אתה חייב, תגדיר typedef עם החתימה של הפונקציה, ותקרא לפונקציה דרך האובייקט.

יש פרק ב- Teach yourself C++ in 21 days שמדבר על פוינטרים לפונקציות, שנראה לי שכדאי לך לקרוא אם אתה הולך להתעסק עם זה.

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

פורסם

כמו שנאמר כאן, מצביעים לפונקציות הוא דבר שימושי ב-C, לא ב-C++.

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

פורסם

יש ב-C++ יצור שנקרא pointer to member function.

השימוש בו הוא כבד מבחינה סינטקטית (write-only-code כמעט) ואם אתה אתה עובד ב-OO כנראה שאתה בכיוון הלא נכון אם ה-design שלך משתמש בזה. למרות הכל יש לזה שימוש אמיתי במצבים מסויימים ולכן הנה דוגמה:


class Base {
// ...
bool f( int x );
// ...
};

typedef bool (Base::*Base_Mem_Func)(int);

bool call_func_on_base ( Base* pb, Base_Mem_Func mem_func, int param )
{
return (pb->*mem_func)( param );
}

// ...
int main( int argc, char *argv[] )
{
// ...
Base b;
if ( !call_func_on_base( &b, &Base::f, 42 ) ) {
return 1;
}
// ...
}

מספר נקודות חשובות:

1) pointer to member function הוא לא pointer to function. גם לא ניתן להמיר ביניהם בצורה בטוחה.

2) הסינטקס הוא זוועתי.

3) כן, pmf מכבד כללי פולימורפיזם. אם f היתה וירטואלית והיינו קוראים ל-call_func_on_base עם אובייקט Dervided שיורש מ-Base ומממש את f אז Derived::f היתה נקראת.

4) לא ניסיתי לקמפל ולהריץ את הדוגמא שהבאתי כאן. אני חושב שאין טעות אבל ראה נקודה 2 לעיל.

יש עוד הרבה דברים שכדאי לדעת על זה. google is your friend.

ארכיון

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

דיונים חדשים