2011-02-11 16 views
27

मैं दो कक्षाएं बनाने की तलाश में हूं, जिनमें से प्रत्येक में अन्य वर्ग प्रकार का एक वस्तु है। मैं यह कैसे कर सकता हूँ? यदि मैं ऐसा नहीं कर सकता, तो क्या कोई काम-आसपास है, जैसे कि प्रत्येक वर्ग में पॉइंटर अन्य क्लास प्रकार में है? धन्यवाद!सी ++ में दो कक्षाएं कैसे बनाएं जो डेटा को डेटा के रूप में उपयोग करें?

यहाँ मैं क्या है:

फ़ाइल: bar.h

#ifndef BAR_H 
#define BAR_H 
#include "foo.h" 
class bar { 
public: 
    foo getFoo(); 
protected: 
    foo f; 
}; 
#endif 

फ़ाइल: foo.h

#ifndef FOO_H 
#define FOO_H 
#include "bar.h" 
class foo { 
public: 
    bar getBar(); 
protected: 
    bar b; 
}; 
#endif 

फ़ाइल: main.cpp

#include "foo.h" 
#include "bar.h" 

int 
main (int argc, char **argv) 
{ 
    foo myFoo; 
    bar myBar; 
} 

$ जी ++ main.cpp

In file included from foo.h:3, 
       from main.cpp:1: 
bar.h:6: error: ‘foo’ does not name a type 
bar.h:8: error: ‘foo’ does not name a type 

उत्तर

72

के बाद से अन्यथा आप वस्तु के लिए अनंत अंतरिक्ष आवश्यकता होगी आप दो वर्गों सीधे अन्य प्रकार की वस्तुओं को शामिल नहीं हो सकता है (के बाद से foo एक बार होता है एक फू है जिसमें एक बार है आदि)

हालांकि आप वास्तव में दो कक्षाओं के स्टोर पॉइंटर्स को एक दूसरे के साथ कर सकते हैं। ऐसा करने के लिए, आप आगे घोषणाओं ताकि दो वर्गों एक दूसरे के अस्तित्व के बारे में पता का उपयोग करना होगा:

#ifndef BAR_H 
#define BAR_H 

class foo; // Say foo exists without defining it. 

class bar { 
public: 
    foo* getFoo(); 
protected: 
    foo* f; 
}; 
#endif 

और

#ifndef FOO_H 
#define FOO_H 

class bar; // Say bar exists without defining it. 

class foo { 
public: 
    bar* getBar(); 
protected: 
    bar* f; 
}; 
#endif 

सूचना है कि दो हेडर प्रत्येक शामिल नहीं हैं अन्य। इसके बजाए, वे आगे की घोषणाओं के माध्यम से अन्य वर्ग के अस्तित्व के बारे में जानते हैं। फिर, इन दो वर्गों के लिए .cpp फ़ाइलों में, आप कक्षा के बारे में पूरी जानकारी प्राप्त करने के लिए #include अन्य शीर्षलेख कर सकते हैं। ये आगे की घोषणाएं आपको "फू की जरूरतों के लिए आवश्यक आवश्यकताओं को रोकने की जरूरत है" के संदर्भ चक्र को तोड़ने की अनुमति देती है।

+8

"foo बार foo जरूरतों बार की जरूरत की जरूरत है।" lawl। = पी – prolink007

3

यह समझ में नहीं आता है। यदि ए में बी है, और बी में ए है, तो यह अनंत आकार होगा। दो बक्से रखने और एक दूसरे में दोनों को रखने की कोशिश की कल्पना कीजिए। काम नहीं करता है, है ना?

प्वाइंटर हालांकि काम करते हैं:

#ifndef FOO_H 
#define FOO_H 

// Forward declaration so the compiler knows what bar is 
class bar; 

class foo { 
public: 
    bar *getBar(); 
protected: 
    bar *b; 
}; 
#endif 
+9

मैंने देखा कि यह फ़ुतुरामा पर काम करता है! –

संबंधित मुद्दे