2009-09-28 9 views
17

मैं निम्न कार्य करने की कोशिश कर रहा हूँ:क्या एक नेस्टेड सी ++ वर्ग अपनी संलग्न कक्षा का उत्तराधिकारी हो सकता है?

class Animal 
{ 
    class Bear : public Animal 
    { 
     // … 
    }; 

    class Giraffe : public Animal 
    { 
     // … 
    }; 
}; 

... लेकिन मेरे संकलक इस पर गला घोंटना करने के लिए प्रकट होता है। क्या यह कानूनी सी ++ है, और यदि नहीं, तो क्या एक ही चीज़ को पूरा करने का एक बेहतर तरीका है? अनिवार्य रूप से, मैं एक क्लीनर वर्ग नामकरण योजना बनाना चाहता हूं। (मैं Animal और सामान्य बेस क्लास से भीतरी कक्षाएं प्राप्त नहीं करना चाहता)

+2

एक शुरुआत के लिए, आप एक वर्ग घोषणा के बाद अर्धविराम से समापन ब्रेसिज़ का पालन करने की जरूरत है। –

+0

मैं अस्पष्ट हूं कि आप ऐसा क्यों करना चाहते हैं। अगर मैं सही ढंग से समझता हूं, तो भालू वर्ग के अंदर एक भालू वर्ग होगा, जो ... थोड़ा अजीब लगता है। –

उत्तर

37

आप जो भी चाहते हैं वह कर सकते हैं, लेकिन आपको नेस्टेड कक्षाओं की परिभाषा में देरी होनी है।

class Animal 
{ 
    class Bear; 
    class Giraffe; 
}; 

class Animal::Bear : public Animal {}; 

class Animal::Giraffe : public Animal {}; 
2

वास्तव में सवाल का जवाब नहीं देता है, लेकिन मुझे लगता है कि आप नेस्टेड क्लास का दुरुपयोग कर रहे हैं, शायद आपको नामस्थानों पर एक नज़र रखना चाहिए (वैसे, जवाब है "यह संभव नहीं है, क्योंकि पशु एक अधूरा प्रकार है")।

15

कक्षा के प्रकार को अपूर्ण माना जाता है जब तक इसकी परिभाषा समाप्त नहीं हो जाती है। आप अधूरे वर्ग से उत्तराधिकारी नहीं हो सकते हैं ताकि आप कक्षा को संलग्न करने से वंचित न हो सकें।

संपादित करें: सुधार
के रूप में रिचर्ड वुल्फ मुझे सही किया: यह वर्ग enclosing यदि आप नेस्टेड वर्गों की परिभाषा में देरी से प्राप्त करना संभव है। विवरण के लिए उसका जवाब देखें।

+1

निहित कक्षा घोषित करना संभव है। –

+1

मुझे नहीं पता था कि इसे संलग्न वर्ग के बाहर नेस्टेड कक्षा को परिभाषित करने की अनुमति है। लेकिन कोशिश की और, आश्चर्यजनक रूप से मेरे लिए, यह काम करता है। –

+0

@tkopec, आप अपने कथन को सही करने के लिए अपना उत्तर क्यों संपादित नहीं करते? यह आपको अपने दो अंक वापस देगा, और मुझे मेरा एक। मुझे यह अजीब लगता है, खासकर जब से आप जानते हैं * यह गलत है, अब। –

2

मुझे यह स्पष्ट नहीं है कि आप यहां क्या हासिल करने की कोशिश कर रहे हैं लेकिन आप इसे नामस्थानों के माध्यम से प्राप्त करने में सक्षम हो सकते हैं।

namespace creatures 
{ 

class Animal 
{ 
}; 

class Bear : public Animal 
{ 
}; 

class Giraffe : public Animal 
{ 
}; 


} 

यह जानवरों के प्रकार के रूप में भालू और जिराफ वाणी लेकिन एक नाम स्थान में पूरी बात कहते हैं आप देख रहे हैं आधार वर्ग वैश्विक नामस्थान को दूषित नहीं करने के लिए।

0

"उल्टा-डाउन विरासत" की एटीएल विधि पर विचार करना हमेशा लायक है। जब भी मुझे ऐसा करने की ज़रूरत होती है तो यह मेरे सिर को चोट पहुंचाता है, लेकिन आपके द्वारा प्राप्त ऑब्जेक्ट-कोड की दक्षता नामुमकिन है। कहीं मैंने जिम बेवरिज द्वारा आलेख को फिसल दिया जो मैंने कभी देखा सबसे अच्छा स्पष्टीकरण था, लेकिन आज यह खोजना मुश्किल है, मैं बस इसका संदर्भ देखता हूं।

"मार्च 25, 2004 ... जिम बेवरीज से एक उत्कृष्ट लेख: ATL और उलटा नीचे विरासत .."

+0

लेख इलेक्ट्रिक स्वर्ग में चला गया है, लेकिन archive.org की सौजन्य, http://web.archive.org/web/20070805214320/http://apostate.com/programming/atlupsidedown.html पर पहुंचा जा सकता है। – ndkrempel

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

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