मेरे पास दो शीर्ष वर्ग दोनों अलग-अलग शीर्षलेख फ़ाइलों में परिभाषित हैं। प्रत्येक फ़ाइल में एक फ़ील्ड होता है जो अन्य वर्ग का प्रकार होता है। अब मैं प्रत्येक फ़ाइल के शीर्षलेख में अन्य फ़ाइल के शीर्षलेख में शामिल हूं, लेकिन कंपाइलर त्रुटियां उत्पन्न कर रहा है। मैं क्या खो रहा हूँ?सी ++ हेडर फाइलें एक दूसरे के साथ पारस्परिक रूप से
उत्तर
आप प्रत्येक वर्ग में "एक ऐसा क्षेत्र नहीं है जो अन्य वर्ग का प्रकार है"; यह एक पुनरावर्ती परिभाषा होगी और न केवल संकलक इसे समझने में सक्षम नहीं होगा, यह तार्किक अर्थ भी नहीं बनाता है।
प्रत्येक वर्ग में एक वर्ग है जो कि अन्य वर्ग का प्रकार है, वह असंभवता है जिसे आप केवल एम.सी. में देखते हैं। Escher चित्र, या एनिमेशन उसके इस तरह:
स्रोत: escherdroste.math.leidenuniv.nl
Escher के "प्रिंट गैलेरी" लिथोग्राफ, 1956 के आधार पर, see Wikipedia
दो क्षेत्रों में से एक तो के रूप में पुनरावर्ती रोकथाम को तोड़ने के लिए, एक सूचक होना होगा, और तार्किक असंभवता से बचें।
जो हमें अगली समस्या में लाता है: यदि कक्षा बी में कक्षा ए का एक उदाहरण होना है, तो जाहिर है, ए को कक्षा बी से पहले घोषित किया जाना चाहिए, ताकि बी को संकलित करते समय ए को पहले से ही संकलक के लिए जाना जाता है लेकिन यदि कक्षा ए से पहले कक्षा ए घोषित किया गया है, तो हम ए में बी को सूचक कैसे घोषित कर सकते हैं? कक्षा बी अभी तक ज्ञात नहीं है जब ए संकलित है! इसका उत्तर एक विशेष निर्माण है जिसे अग्रेषित घोषणा कहा जाता है जो इस तरह की स्थितियों को समायोजित करने के लिए ठीक से मौजूद है।
class B;
सभी यह संकलक है कि वहाँ एक वर्ग बी यह वर्ग बी की सामग्री के बारे संकलक कुछ नहीं बताता है कहा जाता हो जाएगा कह रहा है
, इसलिए वहाँ है: वर्ग बी के एक आगे घोषणा इस तरह दिखता है बहुत कम हम इसके साथ क्या कर सकते हैं, लेकिन हम एक बात कर सकते हैं: बी को घोषित संकेत
तो, समस्या का पूर्ण समाधान इस तरह दिखता है:
फ़ाइल "आह":
/* This is called a "forward declaration". We use it to tell the compiler that the
identifier "B" will from now on stand for a class, and this class will be defined
later. We will not be able to make any use of "B" before it has been defined, but
we will at least be able to declare pointers to it. */
class B;
class A
{
/* We cannot have a field of type "B" here, because it has not been defined yet.
However, with the forward declaration we have told the compiler that "B" is a
class, so we can at least have a field which is a pointer to "B". */
B* pb;
}
फ़ाइल "B.h":
#include "A.h"
class B
{
/* the compiler now knows the size of "A", so we can have a field of type "A". */
A a;
}
[एनीमेशन स्रोत] (http://escherdroste.math.leidenuniv.nl/index.php?menu=animation) – Potatoswatter
@Potatoswatter बहुत बहुत धन्यवाद! मैंने छवि के कैप्शन में संशोधन किया। –
आपको अन्य लोगों के अंदर हेडर फ़ाइलों को शामिल नहीं करना चाहिए, बस अपनी स्रोत फ़ाइलों में हेडर फाइलें शामिल करें। ,
// Class1.h
#ifndef __CLASS_1_H
#define __CLASS_1_H
// content
#endif
नोट: आगे की घोषणाओं का अर्थ है कि आप केवल उस वर्ग का उपयोग हेडर फ़ाइल में पॉइंटर के रूप में कर सकते हैं। एक वर्ग उदाहरण नहीं है। –
अच्छा बिंदु, मैं इसका उल्लेख करना भूल गया! –
आप इसे फ़ंक्शन की घोषणा में और संदर्भ प्रकार के भाग के रूप में रिटर्न प्रकार या पैरामीटर प्रकार के रूप में भी उपयोग कर सकते हैं। –
आप शायद घोषणा आगे उपयोग करना चाहते हैं:
// In Class1.h
class Class2;
// In class2.h
class Class1;
इसके अलावा, आप एक फाइल दो बार पूर्वप्रक्रमक का उपयोग कर शामिल किया जा रहा के खिलाफ की रक्षा कर सकते हैं:
हेडर में आप एक आगे घोषणा का उपयोग कर सकते जब तक आप वास्तव में एक दूसरे में प्रत्येक वर्ग का उदाहरण नहीं रखना चाहते हैं। इस मामले में आपको कुछ भी उपयोग नहीं करना चाहिए।
मैं जानता हूँ कि यह एक पुराने विषय है, लेकिन हो सकता है आप अभी भी समाधान में रुचि रखते हैं!
वास्तव में सी ++ में आप पॉइंटर्स का उपयोग किए बिना दो कक्षाओं का उपयोग कर सकते हैं और यहां यह कैसे करना है।
फ़ाइल: a.h
#include <b.h>
class A {
B<> b;
}
फ़ाइल:
class A;
template<typename T = A>
class B {
T a;
}
b.h फ़ाइल: main.cpp
#include "a.h"
A a;
और बस!
बेशक यह जिज्ञासा के लिए है :)
मैं आपको इसके लिए +1 दूंगा :-) – MegaManX
धन्यवाद, यह आपकी तरह है :) – Boynux
क्या आपने इसे संकलित करने का प्रयास किया है? एमएसवीसी मुझे त्रुटि देता है: '" बी :: ए "एक अपरिभाषित वर्ग का उपयोग करता है" ए "' – kinokijuf
- 1. एफ #: पारस्परिक रूप से पुनरावर्ती कार्यों
- 2. सीएससीएफजी फाइलें और ऐप.कॉन्फिग फाइलें कैसे Azure वर्कर भूमिकाओं के लिए एक दूसरे से संबंधित हैं?
- 3. स्वचालित रूप से सी हेडर से सी # रैपर बनाना?
- 4. ट्रिगर्स के पारस्परिक रूप से पुनरावर्ती निष्पादन को रोकें?
- 5. स्वचालित रूप से सी हेडर फाइल
- 6. एक डेटाबेस तालिका से दूसरे सी #
- 7. दीवार प्रश्न से दूसरे के लिए सी #
- 8. हेडर से सी ++ फ़ाइल स्वचालित रूप से उत्पन्न करें?
- 9. सी ++ सीखने हेडर फाइलें। इस अर्धविराम के साथ क्या हो रहा है?
- 10. एसक्यूएल-सर्वर: कॉलम को पारस्परिक रूप से अनन्य
- 11. आरएआईआई और कचरा संग्रह पारस्परिक रूप से अनन्य क्यों है?
- 12. केवल हेडर फ़ाइलों के साथ एक सी ++ .lib संकलित?
- 13. अजगर argparse: कुछ संगत तर्क के साथ पारस्परिक रूप से विशिष्ट समूह
- 14. डबल क्लिक बनाम सिंगल क्लिक - ये पारस्परिक रूप से अनन्य
- 15. एक बाइटबफर से दूसरे
- 16. क्यों रीडोनली और अस्थिर संशोधक पारस्परिक रूप से अनन्य हैं?
- 17. मैं दो सामग्रियों के साथ एक दूसरे के साथ एक दूसरे के साथ असाइनमेंट क्यों नहीं दे सकता?
- 18. एक स्टाइलशीट से दूसरे
- 19. डिफ़ॉल्ट रूप से गलत सेट करें यदि कोई अन्य पारस्परिक रूप से अनन्य तर्क सत्य है
- 20. एकाधिक एपीके एक दूसरे के साथ इंटरैक्टिंग
- 21. पायथन पारस्परिक रूप से निर्भर वर्ग (परिपत्र निर्भरता)
- 22. जावा: कैसे कर्सर स्वचालित रूप से एक टेक्स्टफ़ील्ड से दूसरे
- 23. क्या गिट पता लगा सकता है कि दो स्रोत फाइलें अनिवार्य रूप से एक दूसरे की प्रतियां हैं?
- 24. प्रोग्रामेटिक रूप से निरीक्षण करें। क्लास फाइलें
- 25. एक कैनवास से दूसरे
- 26. सी में एक टाइमज़ोन से दूसरे में प्रोग्रामेटिक रूप से समय कैसे परिवर्तित करें?
- 27. सी ++ में पारस्परिक बहिष्करण को संभालना 11
- 28. वीडियो को एक साथ एक साथ आसानी से चलाएं [बिना किसी दूसरे से दृश्यमान स्विचिंग के]
- 29. जावा - दो फाइलें परमाणु रूप से
- 30. कमांड लाइन विकल्प का उपयोग कर हेडर फाइलें शामिल करें?
किस प्रकार का "फ़ील्ड"? – fge