"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > C++ में हेडर के बीच सर्कुलर निर्भरता को कैसे संभालें?

C++ में हेडर के बीच सर्कुलर निर्भरता को कैसे संभालें?

2024-11-12 को प्रकाशित
ब्राउज़ करें:131

 How to Handle Circular Dependencies Between Headers in C  ?

हेडर सी में एक-दूसरे को शामिल करते हैं

सी में, हेडर के लिए कभी-कभी एक-दूसरे को शामिल करना आवश्यक होता है। हालाँकि, इससे समस्याएँ पैदा हो सकती हैं, खासकर जब #include स्टेटमेंट्स को रखने की बात आती है।

मैक्रोज़ के अंदर या बाहर

सामान्य तौर पर, #include स्टेटमेंट्स को रखना चाहिए मैक्रोज़ के अंदर रखा जाना चाहिए, जैसे #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. के बीच पारस्परिक समावेशन के कारण अनिश्चित काल तक पुनरावृत्ति होती है।

अघोषित प्रकार

हालांकि, #include स्टेटमेंट को मैक्रोज़ के अंदर रखने से अघोषित प्रकार की समस्याएं हो सकती हैं। उदाहरण के लिए, निम्नलिखित कोड पर विचार करें:

// 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 के भीतर एक अघोषित प्रकार है। ऐसा इसलिए है क्योंकि B.h को शामिल करने पर A.h में फॉरवर्ड डिक्लेरेशन दिखाई नहीं देता है।

समाधान: फॉरवर्ड डिक्लेरेशन

इन मुद्दों को हल करने के लिए, फॉरवर्ड डिक्लेरेशन का उपयोग करना सबसे अच्छा है और जहां आवश्यक हो वहां पूरी परिभाषा वाला हेडर शामिल करें। इस उदाहरण में, B की परिभाषा से पहले A की अग्रेषित घोषणा को B.h में जोड़ा जाना चाहिए:

// 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