"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التعامل مع التبعيات الدائرية بين الرؤوس في C++؟

كيفية التعامل مع التبعيات الدائرية بين الرؤوس في C++؟

تم النشر بتاريخ 2024-11-12
تصفح:974

 How to Handle Circular Dependencies Between Headers in C  ?

الرؤوس تتضمن بعضها البعض في لغة C

في لغة C، من الضروري أحيانًا أن تتضمن الرؤوس بعضها البعض. ومع ذلك، يمكن أن يؤدي هذا إلى مشكلات، خاصة عندما يتعلق الأمر بمكان وضع عبارات التضمين.

داخل أو خارج وحدات الماكرو

بشكل عام، يجب أن تتضمن عبارات التضمين يتم وضعها داخل وحدات الماكرو، مثل #ifndef تتضمن الحراس. وهذا يمنع التكرار اللانهائي أثناء الترجمة، كما هو موضح في المثال التالي:

// A.h
#ifndef A_H_
#define A_H_

#include "B.h"

class A {
    private:
        B b;
    public:
        A() : b(*this) {}
};

#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_

#include "A.h"

class B {
    private:
        A& a;
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_

يؤدي وضع عبارات #include خارج وحدات الماكرو إلى تكرار المترجم إلى أجل غير مسمى بسبب التضمين المتبادل بين A.h وB.h.

أنواع غير معلنة

ومع ذلك، فإن وضع عبارات التضمين # داخل وحدات الماكرو يمكن أن يؤدي إلى مشكلات تتعلق بالأنواع غير المعلنة. على سبيل المثال، خذ بعين الاعتبار الكود التالي:

// A.h
#ifndef A_H_
#define A_H_

class A;  // Forward declaration

#include "B.h"

class A {
    private:
        B b;
    public:
        A() : b(*this) {}
};

#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_

#include "A.h"

class B {
    private:
        A a;  // Directly include A
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_

في هذه الحالة، سيشكو المترجم من أن A هو نوع غير معلن داخل B.h. وذلك لأن الإقرارات الأمامية في A.h غير مرئية عند تضمين B.h.

الحل: الإقرارات الأمامية

لحل هذه المشكلات، من الأفضل استخدام الإقرارات الأمامية وقم بتضمين الرأس الذي يحتوي على التعريف الكامل عند الضرورة. في هذا المثال، يجب إضافة إعلان أمامي لـ A إلى B.h قبل تعريف B:

// B.h
#ifndef B_H_
#define B_H_

class A;  // Forward declaration

#include "A.h"

class B {
    private:
        A a;  // Directly include A
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3