ABA


"|++C| הפעלת אופרטור insertor על אובייקט כ-right-hand"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15911 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15911
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:20   24.05.10   
אל הפורום  
  |++C| הפעלת אופרטור insertor על אובייקט כ-right-hand  
 
איך ניתן לעשות אופרטור שיודע לקבל אובייקט כ-righthand, ולבצע עליו פעולות שונות.

כלומר, לעשות משהו כזה: ;char* >> Object
אני מניח שאפשר אולי לעשות אופרטור כפונקציה גלובאלית?
(אפשר בכלל לחפוף אופרטורים מחוץ למחלקה?)
ואז להפעיל דרכו פונקציית private של האובייקט.
;(*Object.concatenate(char
כמובן שהאופרטור יהיה צריך להיות מוגדר כ-friend של המחלקה.

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


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אממ אז ככה פאביו ג'וניור 24.05.10 13:16 1
     את זה אני יודע לעשות. Zippo  24.05.10 13:33 2
         ostream לא מקבלת אובייקט היא מקבלת instance פאביו ג'וניור 24.05.10 14:11 3
             אבל בכל מקרה אם מה שהתכוונת זה Instance פאביו ג'וניור 24.05.10 14:30 4
                 אני יודע לעשות את זה... Zippo  24.05.10 19:57 5
                     אבל זה בדיוק מה שעניתי לך חחח אתה מפספס משהו פאביו ג'וניור 24.05.10 21:48 6
                         אחלה! תודה רבה. Zippo  24.05.10 21:58 7
                             שמח לעזור תודיע לי :) למרות שאם מה ששמתי בתגובה 4 פאביו ג'וניור 24.05.10 22:31 8
                                 עובד אחלה! Zippo  25.05.10 00:03 9

       
פאביו ג'וניור

   13:16   24.05.10   
אל הפורום  
  1. אממ אז ככה  
בתגובה להודעה מספר 0
 
   בעיקרון אתה לא יכול לשלוח רק סוג משנה ככה בC++...
אין דרך עד כמה שאני יודע לעשות שורה כמו שאתה אמרת..
אבל יש דברים אחרים..
סתם לדוגמא אתה רוצה לממש אפשרות כזאת:

cout << object;

מה שאתה עושה בשביל לממש דבר כזה זה לעשות פונקציה חיצונית, ככה:

ostream& operator<<(ostream& out, const object& a)
(במקרה של cout אתה לא נוגע באובייקט ולכן הוא const... זה לא חובה מן הסתם)
הפונקציה הזאת צריכה להיות חברה של המחלקה (עוד שימוש ל friend שמישהו שאל למה קיים...)
ואז בעצם האופרטור יהיה "מצד שמאל" של האובייקט..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   13:33   24.05.10   
אל הפורום  
  2. את זה אני יודע לעשות.  
בתגובה להודעה מספר 1
 
אבל מן הסתם אפשר לחפוף גם את cin.
ואז לכתוב שורה בצורה הזאת:

;cin >> object

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

אני די בטוח שזה ניתן לביצוע, אני רק לא הבנתי איך לעשות את זה...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   14:11   24.05.10   
אל הפורום  
  3. ostream לא מקבלת אובייקט היא מקבלת instance  
בתגובה להודעה מספר 2
 
   אין דרך בC++ לשלוח רק סוג משנה (סוג אובייקט..)
אם אתה מדבר באופן כללי משהו שיהיה עם משתנה מסוג char* זה משהו אחר..
אבל פונקציה שמקבלת סוג לא קיים דבר כזה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   14:30   24.05.10   
אל הפורום  
  4. אבל בכל מקרה אם מה שהתכוונת זה Instance  
בתגובה להודעה מספר 3
 
   אז זה מבוצע באותה הדרך:

#include <iostream>
using namespace std;
class helloWorld
{
public:
char* str;
};

void operator<<(char* &in, const helloWorld& inst);

int main()
{
helloWorld inst;
inst.str = "hello world";


char* tmp;

tmp << inst;

cout<<tmp<<endl;

return 0;
}

void operator<<(char* &in, const helloWorld& inst)
{
in = inst.str;
}


(השורה tmp << inst; זאת השורה המדוברת)
cout וcin לא יודעות לטפל בכל אובייקט... אם זה מה שהתכוונת אז זה לא נכון ^^


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   19:57   24.05.10   
אל הפורום  
  5. אני יודע לעשות את זה...  
בתגובה להודעה מספר 4
 
כמו שאמרתי, אין בעיה להוציא ל-cout אובייקט...
העיקר שהוא יוגדר.

משהו זריז שכתבתי:


#include <iostream>
using namespace std;

class YayMe
{
private:
int awesomeness;

public:
YayMe(int num = 10000):awesomeness(num){}
~YayMe(){}
friend ostream& operator << (ostream& os, const YayMe&);
};

ostream& operator << (ostream& os, const YayMe& ym)
{
for(int i=0; i<ym.awesomeness; i++)
os << "i'm awesome!!! ";

return os << endl << "P.S, you're ok too..." << endl;
}

int main()
{
YayMe gilad;
cout << gilad;
system("PAUSE");
return 0;
}

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


char str[] = "i'm awesome!";
MyClass object;
str >> object;


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   21:48   24.05.10   
אל הפורום  
  6. אבל זה בדיוק מה שעניתי לך חחח אתה מפספס משהו  
בתגובה להודעה מספר 5
 
   בשביל לעשות את הדבר הזה:
str>>object;
אתה יוצר פונקציה חיצונית (!!) מחוץ לCLASS פונקציה גלובלית שתיראה ככה:

void operator>>(char* &in, const MyClass obj)
{
obj.str = str
}

זה בדיוק יאפשר את הפעולה שכתבת חחח זה בדיוק מה שאמרתי שים לב איך הפונקציה כתובה ^^
רק צריך לשים לב שנהוג לשים פונקציות כאלה כחברות בשביל שתוכל לגשת ל.str (סתם לצורך הדוגמא לmyclass יש char* str בפנים..)

זה יעבוד זה יתקמפל זה לא קשור רק לostream או לiostream זה עובד ככה להכל חחח


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   21:58   24.05.10   
אל הפורום  
  7. אחלה! תודה רבה.  
בתגובה להודעה מספר 6
 
כבר בודק אם זה עובד.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פאביו ג'וניור

   22:31   24.05.10   
אל הפורום  
  8. שמח לעזור תודיע לי :) למרות שאם מה ששמתי בתגובה 4  
בתגובה להודעה מספר 7
 
   התקמפל אז גם זה אמור


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zippo 
חבר מתאריך 26.5.02
7921 הודעות
   00:03   25.05.10   
אל הפורום  
  9. עובד אחלה!  
בתגובה להודעה מספר 8
 
תודה רבה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net