2011-02-09 12 views
7
class A 
{ 
    A a;//why can't we do this 
}; 
+1

इस तरह की कक्षा तत्काल होने पर क्या होगा? यह एक ए का निर्माण करेगा, जो समय के अंत तक एक और ए बनाता है, और इसी तरह। तो, हाँ, एक कन्स्ट्रक्टर जो स्टैक ओवरफ्लो बनाता है वह अच्छी बात नहीं है। ओह, हाँ, और उदाहरण एक अनंत आकार होगा। –

+13

यह कछुए सभी तरह से नीचे है। – jason

उत्तर

15

आप

class A { 
    A* a; 
} 

कर सकते हैं क्योंकि यह ए

6
A a;//why can't we do this 

क्योंकि A, एक अधूरी प्रकार है के रूप में यह अभी तक परिभाषित नहीं किया गया, बल्कि यह परिभाषित किया जा रहा है। और संकलक जब यह class A अंदर देखता है A की पूरी प्रकार पता करने की जरूरत है, और तब से A अधूरा है, यह निर्धारित नहीं कर सकता यह आकार है, यह निर्धारित नहीं कर कर सकते हैं कितनी जगह सदस्य चर a लेने के लिए जा रहा है, इसलिए यह संकलित नहीं करेगा।

लेकिन चूंकि एक सूचक का आकार संकलक के लिए जाने-माने है, इससे कोई फर्क नहीं पड़ता कि यह किस प्रकार का सूचक है। आप इस तरह से अपनी कक्षा में एक सूचक को परिभाषित कर सकते हैं:

class A 
{ 
    A *pA; //okay since sizeof(pA) == sizeof(void*) == well-known to the compiler! 
}; 

ऑनलाइन डेमो: http://www.ideone.com/oS5Ir

16

क्योंकि वर्ग के आकार में अनंत होगा।

(यह निर्दिष्ट करने के आप अधूरा प्रकार नहीं हो सकता है के रूप में सदस्यों, केवल उन्हें संदर्भ या संकेत द्वारा भाषा के लिहाज से किया जाता है, और कहा कि A वर्ग परिभाषा के अंत तक एक अधूरी प्रकार है।)

+12

तो क्या होगा यदि यह अनंत आकार का है? मेमोरी आजकल सस्ता है! –

+2

@ जेम्स: मुझे उस व्यक्ति को याद दिलाता है जो एक कार्यक्रम लिखना चाहता था जो 23 अक्षरों तक के हर संभव शब्द को बनाता है और जब मैंने उसे बताया कि उसे इसके लिए दस लाख से अधिक टीबी हार्ड डिस्क की आवश्यकता होगी तो उसे झुकाव नहीं है ... – EboMike

9

मुझे लगता है कि आप जावा या कुछ से आ रहे हैं? A a टाइप A का एक पूर्ण उदाहरण बनाएगा, जिसमें अच्छी तरह से A है, जिसमें A है, जिसमें A शामिल है।

आप शायद इस बारे में सोच रहे:

class A 
{ 
    A *a; // A pointer to A, not a full instance 
}; 
1

सी में की ++ आकार जानने की आवश्यकता नहीं है: आप ऐसा नहीं कर सकता, क्योंकि यह इस समस्या को खत्म करने के लिए रिकर्सिव संरचना (ऑब्जेक्ट आकार की गणना के लिए कोई अंत नहीं होगा),
स्वयं रेफरेंस का उपयोग करें ial सूचक यानी सूचक के समान वर्ग प्रकार का पता है।

class A 
{ 
    A* aObj; // Self Referential Pointer 
} 
1

इस तरह आप एक सूचक वर्ग ए की आपत्ति उठाने का हो सकता है और इस तरह से यह वर्ग एक के आकार का पता करने के लिए इससे पहले कि यह संकलन समय पर घोषित किया जाता है की आवश्यकता नहीं है।

class A { 
A* a; 
}; 
-1
Class Date 
    { 
    int d,m,y; 
    static Date default_date; 
    }; 

इस उदाहरण में "- 3 संस्करण Bjarne Stroustrup सी ++ प्रोग्रामिंग भाषा" दिया जाता है।

और यह काम करता है ... कुछ स्पष्टीकरण अच्छा होगा।

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

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