ABA


"להבין C++ - חלק #2."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15956 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15956
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   21:09   19.06.10   
אל הפורום  
  להבין C++ - חלק #2.  
 
   קישור עם הסברים לחלק הראשון, לטובת אלו שמצטרפים אלינו בפעם הראשונה:
https://rotter.name/nor/prog/15952.shtml

הפעם הבעיה תשאר עד יום חמישי, שאחזור הביתה מהצבא.

הבעיה הפעם:

בחור יקר ונחמד כתב לו קוד מאוד חשוב. הקוד הנ"ל אמור להדפיס האם המשתנה החבר במחלקה A הוא המספר 10. זה בסה"כ כל הדרישה מהקוד.
שמח וטוב לב, קימפל הבחור היקר את התוכנית שלו.

להפתעתו הרבה, הפלט שקיבל לא היה הפלט שציפה לו:

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


#include <iostream>

using namespace std;

#define TRACE(x) OutputDebugStringA(x)


class A {
public:
A() { m_someVariable = 10; }
void printSomething() {
if (m_someVariable == 10) {
cout << "Variable is 10!" << endl;
}
else {
cout << "Variable isn't 10! :(" << endl;
}
}
private:
int m_someVariable;
};


class B {
public:
B(A* theFirstClass) { theFirstClass->printSomething(); }
};


class C {
public:
C() : m_someClass1(new A), m_someClass2(new B(m_someClass1)) {}
private:
B* m_someClass2;
A* m_someClass1;
};


int main ()
{
C testClass;
}

לירן.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  אני לא יודע בכלל איך זה רץ לך והביא לך את התוצאה הזאת ronen333  19.06.10 23:51 1
  אני שאלתי חידה כזאת לפני הרבה זמן בפורום , נראה מי זוכר Net_Boy  20.06.10 01:29 2
     אני זוכר אבל אני לא מגלה חח :) Deuce  20.06.10 01:45 3
  אז ככה (במידה ואנלא טועה :P) פאביו ג'וניור 20.06.10 02:02 4
  צודקים כולכם. Sn00py  20.06.10 06:13 5
     תודה רבה לירן :) ronen333  20.06.10 10:24 6

       
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   23:51   19.06.10   
אל הפורום  
  1. אני לא יודע בכלל איך זה רץ לך והביא לך את התוצאה הזאת  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 20.06.10 בשעה 00:08 בברכה, ronen333
 
אבל אני די בטוח שזה בגלל הדרך שבה אתה מעביר את בבנאי C את המשתנים, משהו עם הסדר איתחול משתבש אני חושב...
C() : m_someClass1(new A), m_someClass2(new B(m_someClass1)) {}

אם היית רושם:


C()
{
m_someClass1=new A;
m_someClass2=new B(m_someClass1);
}

זה היה עובד...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   01:29   20.06.10   
אל הפורום  
  2. אני שאלתי חידה כזאת לפני הרבה זמן בפורום , נראה מי זוכר  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות, דרג אמינות חבר זה
   01:45   20.06.10   
אל הפורום  
  3. אני זוכר אבל אני לא מגלה חח :)  
בתגובה להודעה מספר 2
 






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

דרג אמינות חבר זה
   02:02   20.06.10   
אל הפורום  
  4. אז ככה (במידה ואנלא טועה :P)  
בתגובה להודעה מספר 0
 
   אם אני זוכר נכון הסדר של המשתנים שאתה כותב שורת איתחול לא משנה...
מה שמשנה זה סדר ההצהרה שלהם..
מה שאומר שבגלל שאתה מצהיר על m_someClass2 לפני m_someClass1 אבל שולח את m_someClass1 לקונסטרקטור שלה, אתה שולח ערך זבל!


עידכון:
לאחר בדיקה, התוכנית עפה (בגלל הערך זבל...) לא יודע איך לך זה מדפיס שזה לא 10.. לי זה פשוט עף כי המצביע מחזיק ערך זבל ואז בהשווה של m_someVariable == 10 הוא עף לי..
וכאשר אני משנה את סדר ההצהרה זה עובד יופי =]


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   06:13   20.06.10   
אל הפורום  
  5. צודקים כולכם.  
בתגובה להודעה מספר 0
 
   זה לא מאוד טריוואילי שהמשתנים לא מאותחלים לפי הסדר ב initialization list, אלא לפי הסדר שבו הם מוצהרים.

יפה
יום חמישי תגיע אחת נוספת.

אגב, תעופה פה שווה למה שיצא לי. VS בדיבאג בלי אופטימזציות מאלקץ את הזיכרון של התוכנית בזבל. בהגדרות דיפולטיות, זה היה עף.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   10:24   20.06.10   
אל הפורום  
  6. תודה רבה לירן :)  
בתגובה להודעה מספר 5
 
  


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

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

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



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