לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 29-01-2009, 23:49
  Dragonion Dragonion אינו מחובר  
 
חבר מתאריך: 22.08.08
הודעות: 310
C++, מצביעים לפונקציות

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

לדוגמא:
קוד PHP:
 #ifdef WIN32
    
some function
#else
    
some function
#endif

function pointer some function 

הבעיה היא, שכאשר אני מנסה לעשות אותו דבר בתוך מחלקה, זה הכל מתפקשש.
הנה סתם דוגמא פשוטה ולא יעילה:
קוד PHP:
 class bla
{
     
bla()
    {
        
#ifdef WIN32
            
Addition = &AdditionW;
        
#else
            
Addition = &AdditionL;
        
#endif
    
}
    
int (*Addition)(int,int);
    
    
#ifdef WIN32
        
int AdditionW(int a,int b){ return a+b; }
    
#else
        
int AdditionL(int a,int b){ return a+b; }
    
#endif
}; 

הקומפיילר אמר לי לשים את השם של המחלקה לפני השם של הפונקצייה, לדוגמא
Addition = &bla::AdditionW;
אבל זה עדיין לא פתר את הבעייה השנייה שאין לי מושג מה היא אומרת:
cannot convert `int (bla::*)(int, int)' to `int (*)(int, int)' in assignment

תודה על כל עזרה
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 30-01-2009, 10:44
צלמית המשתמש של maind
  maind maind אינו מחובר  
 
חבר מתאריך: 08.10.02
הודעות: 827
בתגובה להודעה מספר 1 שנכתבה על ידי Dragonion שמתחילה ב "C++, מצביעים לפונקציות"

קוד:
class bla { #ifdef WIN32 int AdditionW(int a,int b){ return a+b; } #else int AdditionL(int a,int b){ return a+b; } #endif bla() { #ifdef WIN32 Addition = &bla::AdditionW; #else Addition = &bla::AdditionL; #endif } int (bla::*Addition)(int,int); };


אני הייתי משתמש במשהו כזה:

קוד:
class bla { public: virtual int Addition(int,int) = 0; virtual int Sub(int,int) = 0; virtual int Mul(int,int) = 0; virtual int Xor(int,int) = 0; static bla *Create(); }; //Windows implementation #ifdef WIN32 class bla_windows : public bla { public: int Addition(int a,int b) { return a+b; } int Sub(int a,int b) { return a-b; } int Mul(int a,int b) { return a*b; } int Xor(int a,int b) { return a^b; } }; #endif //Linux implementation #ifndef WIN32 class bla_linux : public bla { public: int Addition(int a,int b) { return a+b; } int Sub(int a,int b) { return a-b; } int Mul(int a,int b) { return a*b; } int Xor(int a,int b) { return a^b; } }; #endif bla *bla::Create() { #ifdef WIN32 return new bla_windows; #else return new bla_linux; #endif }


ואז שימוש:
קוד:
bla *a = bla::Create(); a->Addition(1,0); delete a;


וכידי להוסיף למשל עוד מערכת הפעלה כל מה שנדרש זה לממש את המחלקה שוב ולהוסיף עוד שורה שתיים ל
Bla::Create()
ויש גם דרך להתגבר על המגבלה הזאת. אפילו על החובה של השימוש ב create ו delete אפשר להתגבר על ידי שימוש ב class שיכיל את זה.
_____________________________________
Error: Keyboard not found
Press F1 to continue


נערך לאחרונה ע"י maind בתאריך 30-01-2009 בשעה 10:55.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 11:34

הדף נוצר ב 0.06 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר