שימוש במצביע this

שימוש במצביע this

לא ברור לי הצורך בשימוש במצביע הזה וגם אופן הפעולה שלו.
האם שימוש במצביע הזה מתבקש במקרה של יצירה של יותר מאובייקט אחד?
 

אוסנתס

New member
יכול להיות שימוש לדוגמא

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

אוסנתס

New member
תשובה

קוד:
class Box {
   public:
      // Constructor definition
      Box(double l = 2.0, double b = 2.0, double h = 2.0) {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
      }
      double Volume() {
         return length * breadth * height;
      }
      int compare(Box box) {
         return this->Volume() > box.Volume();
      }
      
   private:
      double length;     // Length of a box
      double breadth;    // Breadth of a box
      double height;     // Height of a box
};
העתקתי דוגמא מהקישור: https://www.tutorialspoint.com/cplusplus/cpp_this_pointer.htm
הגדירו מחלקה בשם BOX. הכוונה ל- this היא האובייקט/המופע עצמו. בדוגמא הזו: הפונקציה compare שמוגדרת במחלקה מקבלת בפרמטר אובייקט שגם הוא מסוג box. אם יוצרים למשל שני מופעים/אובייקטים מהמחלקה הזו כאשר האובייקט מפעיל את הפונקציה compare פונים אליו ב- this.
יש ב- google הסברים טובים באנגלית. כל שאלה את יכול להריץ באנגלית ב- google ולקבל תשובות טובות.
 
הדוגמא שלך לא ממש טובה
כי אם תוריד בה את המילה this, התוכנית עדיין תתקמפל באותה צורה ותרוץ באותה צורה. המילה this כאן מיותרת לגמרי ואינה מוסיפה או תורמת שום דבר.
&nbsp
המשתנה this נחוץ בעיקר אם רוצים לשמור את המידע על האובייקט הנוכחי איפשהו, להעביר אותו למישהו אחר (כדי שיוכל לקרוא חזרה אלינו למתודות אחרות בעתיד)
 

אוסנתס

New member
טובה לגמרי

אני לא אמשיך להתווכח כאן עם עלומי שם על למה הסינטקס של השפה הוא כזה, זה מיותר לדעתי. ואם תקרא טוב את הדוגמא ואת השם שלי במקום ישר לרשום לא טוב, זה שם של בת ולא כתוב בשום מקום שזה לא יתקמפל. אתה מוזמן לתת בעצמך דוגמא מקודדת ושימושית, במקום לחפש איפה מה שכתבו לא טוב.
 
עלומי שם?
למה, אוסתנס זה שמך האמיתי? ומה זה קשור למה שכתבתי? נעים מאוד. שמי כתוב בכרטיס, אם הוא מעניין אותך, ואני עובד בפיתוח ב ++C כבר 20 שנה, ובעבר גם ניהלתי את הפורום ששנינו כותבים בו כרגע.
&nbsp
השאלה המקורית היתה למה נחוצה המילה השמורה this. הדוגמא שלך אינה דוגמא טובה משום שהשימוש ב this אינו נחוץ בה כלל, הדוגמא שלך תרוץ בדיוק באותה צורה אם תשתמשי במילה השמורה באופן מפורש ואם לא, ולכן לא הדגמת כאן שום צורך. זה לא קשור לסינטקס של השפה, זה קשור לזה שיש מקרים שבהם this הוא נחוץ והכרחי, וזה לא אחד מהם.
&nbsp
תוכלי לראות דוגמאות למקרים כאלו בקישור הבא:
https://stackoverflow.com/questions/993352/when-should-i-make-explicit-use-of-the-this-pointer
 

אוסנתס

New member
אוסנת שמי האמיתי

מה אתה רוצה שאני אכתוב את השם של דודה שלי? זה לא משנה לי ההסטוריה שלך או כמה שנים אתה מתכנת ב- C++. מספיק להבין את המושג this ולא צריך לחכות ולחפש יומיים תשובה באיזה קוד חוסר שימוש ב- this לא היה מתקמפל. במקום להשתרשר לתשובות של אחרים ולכתוב להם שהתשובה שלהם לא טובה אפשר לענות לשואל תשובה ישירה (...זה טכנית אפשרי בפורום). כל אחד יכול לתכנת 20 שנה ב- C++ אם לחברה יש משאבים להתעסק עם למה צריך this, ולהצמד לתשובות של אחרים ולהעיר להם. אתה מוזמן לענות ישירות לשואל ולהצמד לתשובות שלך במקום להעיר לאחרים אחרי יומיים.
 
כל העיקרון של פורום
הוא שאפשר לפתח דיון. משתמש אחד שואל, משתמש אחר עונה, משתמש שלישי לא מסכים, וכך מתפתח דיון שממנו אפשר ללמוד משהו. כמובן, רק אם רוצים ללמוד. אם לא רוצים, אפשר סתם להתווכח.
&nbsp
בשני שרשורים שונים נתת תשובות שגויות לאנשים. נכון, אפשר היה פשוט לתת תשובה אחרת, ואז לשואל המקורי היו שתי תשובות שונות, ו 50% סיכוי לבחור בכל אחת מהן. או שאפשר להצביע על הטעות, ולהסביר אותה, ואם תהיי פתוחה גם להקשיב, אולי תקבלי את ההסבר. כרגע נראה שאת לוקחת הכל נורא אישי ונעלבת מכך שמתקנים אותך, וכלל לא קוראת את ההסבר. המטרה של להגיב לך היא לא להעליב אותך, המטרה היא לפתח את הנושא, כי הרבה בסוף קוראים את התשובות האלו והן גם מאוחסנות בגוגל לנצח. אם כל אחד היה מדבר רק לעצמו, זה היה פורום עוד יותר דל ומשעמם מאשר מה שהוא היום (ופעם באמת שהוא היה הרבה יותר פעיל ועם דיונים יותר ארוכים).
 

אוסנתס

New member
למה שאתה תקבע אם נתתי תשובה שגויה או לא?

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

אוסנתס

New member
לא מתאים לך שאנשים אחרים עונים

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

פרסאוס

New member
אם אתה מתכוון לקרוא לפונקציה

שצריכה מצביע למחלקה מתוך המחלקה עצמה אתה צריך את המצביע הזה.
למשתנים באותו שם אפשר לשנות את השם.
אי אפשר לעקוף קריאה לפונקציה שדורשת מצביע.
נניח שיש מחלקת שעון.
ונניח שיש מחלקה שניה שמקבלת פרמטר של שעון ומחזירה שעון קיץ/חורף.
אם רוצים לקרוא לשיטה הזו ממחלקת השעון עצמה, מעבירים this.
&nbsp
 
למעלה