c++ - Circular Dependency - (how to let struct A refer to struct B, and struct B refer to struct A) -
मेरे पास वेक्टर 4 नामक एक स्ट्रेट के साथ हैडर फाइल है।
(vector4.h)
<पूर्व> संरचना वेक्टर 4 {फ्लोट वैल्यू [4]; // ..... विधि .....};
मेरे पास मैट्रिक्स 4 नामक एक स्ट्रेट के साथ हैडर फाइल है।
(मैट्रिक्स 4 एच)
struct मैट्रिक्स 4 {फ्लोट वैल्यू [ 16]; // ..... विधि .....};
मैं उन दोनों में एक सदस्य फ़ंक्शन जोड़ना चाहता हूं, कहते हैं कि गुणा () जो पैरामीटर के रूप में अन्य संरचना को लेता है।
मैं आसानी से मैट्रिक्स 4 एच जोड़ सकते हैं। Vector4.h और विधि गुणा () जोड़ते हैं।
अगर मैं मैट्रिक्स 4.h से vector4.h की कोशिश करूँ तो मैं (स्पष्ट रूप से) एक परिपत्र संदर्भ प्राप्त करेगा।
कैसे कर सकते हैं मुझे इस बारे में मिलना चाहिए, अगर सब कुछ हो?
संपादित करें:
@ माइकसेमोर, मैंने लिखा है जो मैंने मान लिया था कि तुम्हारा मतलब था, लेकिन यह काम नहीं करता है।
bar.h
#ifndef BAR_H # परिभाषित BAR_H टेम्पलेट & lt; typename T & gt; संरचना फू; टेम्पलेट & lt; typename T & gt; संरचना बार {टी टी; टी गुणा (const फू & lt; T & gt; और amp; foo) const; }; #endif // BAR_H
foo.h
<पूर्व> #ifndef FOO_H #define FOO_H टेम्पलेट & lt; typename T & gt; संरचना बार; टेम्पलेट & lt; typename T & gt; संरचना फू {टी टी; टी गुणा (const बार & lt; T & gt; & amp; बार) const; }; #endif // FOO_H
bar.cpp
#include "foo.h" #include "bar.h" बार & lt; T & gt; :: गुणा (कॉन्स्ट फू एंड लेफ्टिनेंट; टी & gt; और amp; foo) const {return t * foo.t; }
foo.cpp
#include "foo.h" #include "bar.h" फू & lt; T & gt; :: multiply (const बार & lt; T & gt; & amp; bar) const {return t * bar.t; }
आपको कक्षा से पहले प्रत्येक वर्ग को घोषित करने की आवश्यकता होगी, जिसे संदर्भित करना आवश्यक है यह:
// vector4.h संरचना मैट्रिक्स 4; Struct वेक्टर 4 {// ... शून्य गुणा (मैट्रिक्स 4); }; // मैट्रिक्स 4 एच संरचना वेक्टर 4; Struct मैट्रिक्स 4 {// ... शून्य गुणा (वेक्टर 4); };
फ़ंक्शन परिभाषाएं, दोनों वर्गों की पूर्ण परिभाषा की आवश्यकता होती है, को क्लास परिभाषाओं के बाहर होना होगा।
यदि वर्ग वास्तव में टेम्पलेट हैं, तो उन फ़ंक्शन परिभाषाएं हेडर में होना चाहिए, संरचित है ताकि वे दोनों वर्ग परिभाषाओं के बाद दिखाई दें। हेडर की परिभाषा:
#ifndef BAR_H #define BAR_H टेम्पलेट & lt; typename T & gt; से प्रत्येक हेडर को एक दूसरे से शामिल करना है संरचना फू; टेम्पलेट & lt; typename T & gt; संरचना बार {टी टी; टी गुणा (const फू & lt; T & gt; और amp; foo) const; }; #include "foo.h" टेम्पलेट & lt; typename T & gt; टी बार & lt; T & gt; :: गुणा (const Foo & lt; T & gt; और amp; foo) const {return t * foo.t; } #endif // BAR_H
या आप कार्यों को अलग-अलग हेडर में परिभाषित कर सकते हैं; वे केवल तब उपलब्ध होंगे जब आप उन शीर्ष लेखों को शामिल करेंगे
// bar_multiply.h #include "foo.h" #include "bar.h" टेम्पलेट & lt; typename T & gt; टी बार & lt; T & gt; :: गुणा (const Foo & lt; T & gt; और amp; foo) const {return t * foo.t; }
या, जब से कक्षाएं बहुत कसकर मिलती हैं, तो आप दोनों एक ही हेडर में परिभाषित करने पर विचार कर सकते हैं।
Comments
Post a Comment