2010-07-06 24 views
26

मैं नामस्थान देख रहा हूं और मुझे वास्तव में इन और कक्षाओं के बीच कोई अंतर नहीं दिख रहा है। मैं खुद को सी ++ पढ़ रहा हूं मुझे कई किताबें ऑनलाइन मिल गई हैं, इसलिए मुझे पता है कि मैं सबसे प्रभावी ढंग से नहीं सीख रहा हूं। वैसे भी कोई मुझे दोनों के बीच का अंतर बता सकता है और कक्षा में नामस्थान का उपयोग करने का सबसे अच्छा समय क्या होगा। साथ ही, मैं जिस पुस्तक को पढ़ रहा हूं उसमें मुझे structs के बारे में बहुत कुछ नहीं दिख रहा है।कक्षाओं और नामस्थानों के बीच अंतर?

क्या यह प्रारूप है?

struct go 
{ 

    goNow(){ cout << "go Now"}; 

} 

आपकी सहायता के लिए अग्रिम धन्यवाद।

+0

यह [बातचीत] नहीं है (http://stackoverflow.com/questions/713698/c-namespaces-advice?lq=1) आपको नामस्थानों की भूमिका की सराहना करने में मदद कर सकता है। – jxramos

+0

यह दिलचस्प है कि मैंने किसी को यह नहीं देखा कि वर्ग के सदस्यों और कार्यों तक पहुंच सार्वजनिक, संरक्षित, निजी इत्यादि के माध्यम से कक्षा या संरचना द्वारा नियंत्रित की जा सकती है। – user8381651

उत्तर

57

कक्षाएं और structs प्रकार परिभाषित करते हैं। आप एक प्रकार का ऑब्जेक्ट बना सकते हैं। नेमस्पेस बस एक गुंजाइश घोषित करते हैं जिसमें अन्य प्रकार, कार्य, वस्तुएं, या नामस्थान मौजूद हो सकते हैं। आप प्रकार std की एक वस्तु नहीं बना सकते हैं (जाहिर है जब तक आप एक प्रकार std कहा जाता है, जो std नाम स्थान को छिपाने के हैं बनाया)।

जब आप एक struct/वर्ग (एक विधि) तुम कह रहे हो "यह समारोह संबद्ध डेटा पर एक मौलिक ऑपरेशन है" के अंदर एक समारोह को परिभाषित। जब आप किसी नाम स्थान के अंदर एक समारोह को परिभाषित तुम कह रहे हो

संपादित

"यह समारोह तार्किक नाम स्थान में अन्य कार्यों, प्रकार, और वस्तुओं से संबंधित है" यह शायद उनका कहना है सब कुछ है कि "लायक है एक वस्तु "जावा और सी # जैसी भाषा नियमित रूप से कक्षाओं का उपयोग करती है जैसे कि वे नामस्थान थे क्योंकि वे" मुक्त "फ़ंक्शंस की अनुमति नहीं देते हैं। यह वह जगह हो सकती है जहां भ्रम आता है। यदि आपके पास किसी अन्य भाषा में एक कक्षा है जिसमें स्थिर सदस्यों के अलावा कुछ भी नहीं है, तो आप C++ संस्करण में नामस्थान और निःशुल्क फ़ंक्शंस का उपयोग करना चाहेंगे। (रहने वाले

+16

+1। Structs के बारे में: 'वर्ग' और 'संरचना' अनिवार्य रूप से एक ही बात है - वे अक्सर" उपयोगकर्ता परिभाषित प्रकार "कहा जाता है। केवल अंतर यह है कि 'कक्षा' सदस्यों और आधार वर्गों को डिफ़ॉल्ट रूप से निजी बनाता है, जबकि 'संरचना' उन्हें सार्वजनिक बनाता है। –

+3

मुझे स्कॉट मेयर्स पोस्ट पर पोस्ट किया गया [कैसे गैर-सदस्य कार्य एनकैप्यूलेशन में सुधार करते हैं] (http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197) सीखने के दौरान काफी उपयोगी होना नामस्थान का उपयोग कब करें। – PythonJin

0

विकिपीडिया

सामान्य में से, एक namespace एक अमूर्त आइटम (नाम, या तकनीकी शब्दों, या शब्द) के लिए संदर्भ प्रदान करने कंटेनर यह रखती है और एक ही नाम होने समनाम मदों की बहुविकल्पी लिए अनुमति देता है विभिन्न नामस्थानों में)। नियम के रूप में, नामस्थान में नामों में एक से अधिक वर्तनी नहीं हो सकती है, यानी, इसके घटक समान नाम साझा नहीं कर सकते हैं। नामस्थान को संदर्भ भी कहा जाता है, क्योंकि नाम का वैध अर्थ किस नामस्थान लागू होता है, इस पर निर्भर करता है। इसमें नाम वस्तुएं और अवधारणाओं का प्रतिनिधित्व कर सकते हैं, भले ही यह एक प्राकृतिक या जातीय भाषा है, एक निर्मित भाषा, पेशे की तकनीकी शब्दावली, एक बोली, एक सामाजिक, या एक कृत्रिम भाषा (उदाहरण के लिए, एक प्रोग्रामिंग भाषा)।

दूसरी तरफ A class defines a type

एक नामस्थान में कई कक्षाएं हो सकती हैं।

संपादित

एक अंतर यह इस होगा:

आप अनाम नामस्थान हो सकता है लेकिन आप एक अनाम वर्ग

namespace{ //fine 

      //some code.... 
    } 

    class{ //illegal 
    } 
+4

मैं वास्तव में नहीं देखता कि उद्धृत पाठ सी ++ से कैसे संबंधित है। –

+2

क्या नामस्थानों में सी ++ में एक अलग (कुछ विशिष्ट) भूमिका है? उद्धृत पाठ के साथ क्या गलत है। –

7

एक नाम स्थान नहीं हो सकता पहचानकर्ता समूहीकरण का एक तरीका है ताकि वे संघर्ष न करें।

एक वर्ग किसी ऑब्जेक्ट की पराजय है जिसे तत्काल (आमतौर पर) किया जा सकता है और जो कार्यशीलता और राज्य को समाहित करता है।

नामस्थान और कक्षाएं पूरी तरह से अलग हैं, और विभिन्न उद्देश्यों की सेवा करती हैं। उनके पास कुछ वाक्य रचनात्मक समानता है।

स्ट्रक्चर कक्षाएं हैं, एक अलग डिफ़ॉल्ट पहुंच विनिर्देशक (संरचना के लिए सार्वजनिक, कक्षा के लिए निजी) - अन्य सभी पहलुओं में वे समान हैं।

22

आप अंतर के लिए वेब पर खोज सकते हैं और मुझे यकीन है कि आपको कई मिलेंगे; लेकिन निम्नलिखित महत्वपूर्ण हैं IMHO: -

  • आप नामस्थान फिर से खोल सकते हैं और अनुवाद इकाइयों में सामान जोड़ सकते हैं। आप कक्षाओं के साथ ऐसा नहीं कर सकते हैं।
  • कक्षा का उपयोग करने से तात्पर्य है कि आप उस कक्षा का उदाहरण बना सकते हैं, नामस्थानों के साथ सच नहीं है।
  • आप नामस्थानों के साथ उपयोग-घोषणाओं का उपयोग कर सकते हैं, और संभवतः कक्षाओं के साथ संभव नहीं है जब तक कि आप उनसे प्राप्त न करें।
  • आप नामांकित नामस्थान हो सकते हैं।

एक नामस्थान एक नए दायरे को परिभाषित करता है और नामस्थान के सदस्यों को नेमस्पेस स्कोप कहा जाता है। वे नेस्टेड कक्षाओं को संभालने की असुविधा के बिना नाम टकराव (चर, प्रकार, कक्षाओं या कार्यों के) से बचने का एक तरीका प्रदान करते हैं।

10

कक्षा एक डेटा प्रकार है। यदि आपके पास Foo नाम की कक्षा है, तो आप कक्षा Foo की ऑब्जेक्ट्स बना सकते हैं और उन्हें कई तरीकों से उपयोग कर सकते हैं।

नेमस्पेस केवल वस्तुओं को समूहबद्ध करने का एक सार तरीका है। आम तौर पर, आपके पास bar() नामक प्रोग्राम में दो कार्य नहीं हो सकते हैं। यदि आप उन्हें अलग-अलग नामस्थानों में रखते हैं, तो वे सह-अस्तित्व में हो सकते हैं (उदाहरण के लिए, A::bar() और B::bar())। किसी ऑब्जेक्ट को ऑब्जेक्ट के रूप में नहीं बनाया जा सकता है; एक नामकरण सम्मेलन के रूप में इसे और अधिक सोचें।

आप कोड है कि आप एक वस्तु है कि आप को परिभाषित करने और एक चर के रूप में उपयोग कर सकते हैं के साथ जुड़े होने के लिए चाहते हैं लिख रहे हैं, तो एक वर्ग लिखें। यदि आप एक एपीआई या लाइब्रेरी लिख रहे हैं और आप सभी कार्यों और स्थिरांक को लपेटना चाहते हैं ताकि उनके नाम किसी भी चीज़ के साथ संघर्ष न करें जो उपयोगकर्ता ने लिखा हो, नेमस्पेस का उपयोग करें।

5

एक प्रमुख अंतर यह है कि नामस्थान फिर से खोला जा सकता है, लेकिन कक्षाएं नहीं किया जा सकता:

namespace A { 
    int f1(); 
} 

namespace A { 
    int f2(); 
} 

कानूनी है, लेकिन:

class A { 
    int f1(); 
}; 

class A { 
    int f2(); 
}; 

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