תלות מעגלית בשפות ++C\C

[20 ביוני 2008] [1 תגובות]

תלות מעגלית היא בעיה מאוד מרגיזה התוקפת מתכנתים מתחילים בשפות ++C ו-C. הבעיה נוצרת כאשר אובייקט ראשון(או struct ב-C) מכיל הצבעה לאובייקט שני ואילו האובייקט השני מכיל הצבעה לאובייקט הראשון.

קוד שיוצר את הבעיה:

class A {
public:
	B *my_b;
};

class B {
private:
	A *my_a;
};

int main(){}

המהדר יגיב בשגיאה:

syntax error before `*'

ובצדק. הוא הרי אינו מכיר את B, מכיוון שאובייקט זה עוד לא נכתב.

נסיון ראשון לפתרון

מכיוון שהאובייקט A אינו יכול לכלול את B, ננסה להציב את מחלקה B מעל A:

class B {
private:
	A *my_a;
};

class A {
public:
	B *my_b;
};

int main(){}

אך גם כאן המהדר יצעק:

syntax error before `*'

מכיוון שכעת אובייקט B, מכיל הצבעה לאובייקט A שאותו הוא אינו מכיר...

נסיון שני לפתרון

הפתרון הנכון הוא שימוש ב-Forward Declaration - הצהרה מקדימה המסבירה למהדר כי אין לו מה לדאוג, בקרוב נסביר לו מהו האובייקט B. בקוד זה נראה כך:

class B; // Forward Declaration of class B

class A {
public:
	B *my_b; // The compiler knows that B will be writen sometime in the future
};

class B {
private:
	A *my_a;
};

int main(){}

כעת שכולם מרוצים, אפשר להתחיל לתכנת.

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

1 תגובות

  1. אוראל | 2/11/2013 6:58:55 AM

    השאלה המתבקשת כאן,

    מדוע אני צריך את זה?

    אתה יכול לתת דוגמא לתוכנית שתצתרך להשתמש בדבר כזה.

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

    תודה 

התגובות נעולות