Namespace + एक क्लास पर स्थिर तरीकों के साथ कार्य करता है


290

मान लें कि मेरे पास है, या लिखने जा रहा हूं, संबंधित कार्यों का एक सेट। मान लीजिए कि वे गणित से संबंधित हैं। संगठनात्मक रूप से, क्या मुझे:

  1. इन कार्यों को लिखें और उन्हें मेरे MyMathनाम स्थान पर रखें और उनके माध्यम से देखेंMyMath::XYZ()
  2. नामक एक क्लास बनाएं MyMathऔर इन तरीकों को स्थिर बनाएं और इसी तरह देखेंMyMath::XYZ()

मैं अपने सॉफ़्टवेयर को व्यवस्थित करने के साधन के रूप में एक को क्यों चुनूंगा?


4
एक बात के लिए, नाम स्थान कक्षाओं और स्थिर तरीकों की तुलना में भाषा के अतिरिक्त हाल के हैं, जो उस समय से भाषा में थे जब इसे "सी विद क्लासेस" कहा जाता था। कुछ प्रोग्रामर पुरानी सुविधाओं के साथ अधिक सहज हो सकते हैं। कुछ अन्य प्रोग्रामर पुराने संकलक का उपयोग कर रहे होंगे। बस मेरे $ .02
रोम

21
@ रॉम: आप "पुराने प्रोग्रामर" के बारे में सही हैं, लेकिन "पुराने कंपाइलर" के बारे में गलत हैं। नाम के बाद से नामस्थान सही ढंग से संकलित किए गए हैं (मैंने उनके साथ दृश्य C ++ 6 के साथ काम किया, 1998 से डेटिंग!)। "सी विद क्लासेस" के रूप में, इस फ़ोरम में कुछ लोग तब भी पैदा नहीं हुए थे जब ऐसा हुआ था: एक मानक और व्यापक सी ++ सुविधा से बचने के लिए एक तर्क के रूप में इसका उपयोग करना एक पतन है। अंत में, केवल अप्रचलित C ++ कंपाइलर नेमस्पेस का समर्थन नहीं करते हैं। उस तर्क का उपयोग न करने के बहाने के रूप में उपयोग न करें।
पियरसबल

@paercebal: कुछ प्राचीन संकलक अभी भी एम्बेडेड दुनिया में उपयोग में हैं। नाम का समर्थन नहीं करना शायद सबसे छोटी असुविधाओं में से एक है जिसे विभिन्न छोटे सीपीयू के लिए कोड लिखते समय लगाने की आवश्यकता होती है, जिसे हर कोई हर दिन बातचीत करता है: आपकी स्टीरियो, आपका माइक्रोवेव, आपकी कार में इंजन नियंत्रण इकाई, ट्रैफिक लाइट, आदि। स्पष्ट रहें: मैं हर जगह एक बेहतर, नए संकलक का उपयोग नहीं करने की वकालत कर रहा हूं। Au conrare: मैं सभी नवीनतम भाषा सुविधाओं (RTTI को छोड़कर;) के लिए हूं। मैं सिर्फ इशारा कर रहा हूं कि इस तरह की प्रवृत्ति मौजूद है
रोमन

13
@ रॉम: वर्तमान मामले में, प्रश्न लेखक के पास विकल्प है, इसलिए स्पष्ट रूप से, उसका कोई भी संकलक नामांकित कोड संकलित करने में विफल रहता है। और जैसा कि यह C ++ के बारे में एक प्रश्न है, एक C ++ उत्तर दिया जाना चाहिए, जिसमें नामस्थान और आरटीटीआई के साथ समस्या का समाधान भी शामिल है। C उत्तर देना, या C-with-classes के लिए अप्रचलित-संकलक उत्तर विषय से बाहर है।
पियरसबल

2
"बस मेरे $ .02" - यह अधिक लायक होगा यदि आपने मौजूदा सी ++ संकलक का कोई सबूत प्रदान किया है जो नामस्थान का समर्थन नहीं करता है। "कुछ प्राचीन संकलक अभी भी एम्बेडेड दुनिया में उपयोग में हैं" - यह मूर्खतापूर्ण है; "एम्बेडेड वर्ल्ड" C ++ नामस्थान की तुलना में अधिक हालिया विकास है। "सी विद क्लासेस" 1979 में पेश किया गया था, इससे पहले कि कोई भी किसी भी चीज़ में सी कोड एम्बेड कर रहा था। "मैं सिर्फ इशारा कर रहा हूं कि इस तरह की प्रवृत्ति मौजूद है" - यहां तक ​​कि अगर ऐसा है, तो इस सवाल का कोई लेना देना नहीं है।
जिम बेल्टर

जवाबों:


243

डिफ़ॉल्ट रूप से, नामांकित फ़ंक्शंस का उपयोग करें।

कक्षाएं वस्तुओं का निर्माण करने के लिए हैं, नामस्थानों को बदलने के लिए नहीं।

ऑब्जेक्ट ओरिएंटेड कोड में

स्कॉट मेयर्स ने इस विषय पर अपनी प्रभावी C ++ पुस्तक के लिए एक पूरा आइटम लिखा था, "सदस्य कार्यों के लिए गैर-सदस्य गैर-मित्र कार्यों को प्राथमिकता दें"। मुझे हर्ब सटर के एक लेख में इस सिद्धांत का एक ऑनलाइन संदर्भ मिला:http://www.gotw.ca/gotw/084.htm

यह जानना महत्वपूर्ण है कि: C ++ में समान नामस्थान में एक वर्ग के रूप में कार्य उस वर्ग के इंटरफ़ेस से संबंधित हैं (क्योंकि ADL फ़ंक्शन कॉल को हल करते समय उन कार्यों को खोजेगा)।

जब तक "मित्र" घोषित नहीं किया जाता है, तब तक नामांकित कार्य, क्लास के इंटर्न के लिए कोई पहुंच नहीं है, जबकि स्थिर तरीके हैं।

इसका मतलब है, उदाहरण के लिए, कि अपनी कक्षा को बनाए रखने के दौरान, यदि आपको अपने वर्ग के आंतरिक को बदलने की आवश्यकता है, तो आपको स्थैतिक सहित सभी तरीकों में इसके दुष्प्रभावों की खोज करने की आवश्यकता होगी।

एक्सटेंशन I

एक वर्ग 'इंटरफ़ेस में कोड जोड़ना।

C # में, आप किसी वर्ग तक ऐसे तरीके जोड़ सकते हैं, भले ही आपकी कोई पहुँच न हो। लेकिन C ++ में, यह असंभव है।

लेकिन, अभी भी C ++ में, आप अभी भी एक नामांकित फ़ंक्शन जोड़ सकते हैं, यहां तक ​​कि किसी वर्ग के लिए जो आपके लिए लिखा था।

दूसरी तरफ से देखें, अपने कोड को डिज़ाइन करते समय यह महत्वपूर्ण है, क्योंकि अपने कार्यों को एक नाम स्थान पर रखकर, आप अपने उपयोगकर्ताओं को कक्षा के इंटरफ़ेस को बढ़ाने / पूरा करने के लिए अधिकृत करेंगे।

एक्सटेंशन II

पिछले बिंदु का एक साइड-इफेक्ट, कई हेडर में स्थिर तरीकों की घोषणा करना असंभव है। प्रत्येक विधि को एक ही कक्षा में घोषित किया जाना चाहिए।

नामस्थान के लिए, एक ही नाम स्थान से कई हेडर में फ़ंक्शन घोषित किए जा सकते हैं (लगभग मानक स्वैप फ़ंक्शन इसका सबसे अच्छा उदाहरण है)।

एक्सटेंशन III

एक नामस्थान की मूल शीतलता यह है कि कुछ कोड में, आप इसका उल्लेख करने से बच सकते हैं, यदि आप "का उपयोग कर" कीवर्ड का उपयोग करते हैं:

#include <string>
#include <vector>

// Etc.
{
   using namespace std ;
   // Now, everything from std is accessible without qualification
   string s ; // Ok
   vector v ; // Ok
}

string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR

और आप "प्रदूषण" को एक वर्ग तक सीमित कर सकते हैं:

#include <string>
#include <vector>

{
   using std::string ;
   string s ; // Ok
   vector v ; // COMPILATION ERROR
}

string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR

यह "पैटर्न" लगभग मानक स्वैप मुहावरे के उचित उपयोग के लिए अनिवार्य है।

और कक्षाओं में स्थिर तरीकों के साथ ऐसा करना असंभव है।

तो, C ++ नेमस्पेस के अपने शब्दार्थ हैं।

लेकिन यह और आगे बढ़ जाता है, क्योंकि आप विरासत के समान नामस्थान जोड़ सकते हैं।

उदाहरण के लिए, यदि आपके पास फ़ंक्शन नाम AAA के साथ एक नाम स्थान A, फ़ंक्शन BBB के साथ एक नाम स्थान B है, तो आप नाम स्थान C की घोषणा कर सकते हैं, और कीवर्ड का उपयोग करके इस नामस्थान में AAA और BBB ला सकते हैं।

निष्कर्ष

नाम स्थान के लिए नाम स्थान हैं। कक्षाएं कक्षाओं के लिए हैं।

C ++ को डिज़ाइन किया गया था इसलिए प्रत्येक अवधारणा अलग है, और अलग-अलग मामलों में, अलग-अलग मामलों में, विभिन्न समस्याओं के समाधान के रूप में उपयोग की जाती है।

जब आपको नामस्थान की आवश्यकता हो तब कक्षाओं का उपयोग न करें।

और आपके मामले में, आपको नामस्थान की आवश्यकता है।


क्या यह उत्तर थ्रेड्स पर भी लागू किया जा सकता है, यानी थ्रेड्स के स्थैतिक तरीकों के बजाय नेमस्पेस का उपयोग करना बेहतर है?
डैशी

3
@dashesy: नाम स्थान बनाम स्थिर तरीकों का थ्रेड्स के साथ कोई लेना-देना नहीं है, इसलिए हाँ, नाम स्थान बेहतर हैं क्योंकि नाम स्थान लगभग हमेशा बेहतर होते हैं फिर स्थैतिक तरीके। यदि एक चीज, स्थिर विधियों में कक्षा के सदस्य चर होते हैं, तो वे किसी भी तरह नामस्थान से कम एनकैप्सुलेशन मान रखते हैं। और थ्रेडेड निष्पादन में डेटा को अलग करना और भी महत्वपूर्ण है।
पियरसेबल

@ paercebal- धन्यवाद, मैं थ्रेड फ़ंक्शंस के लिए स्टैटिक क्लास के तरीकों का उपयोग कर रहा था। अब मुझे लगता है कि मैं नाम स्थान के रूप में वर्ग का दुरुपयोग कर रहा था, तो आपको क्या लगता है कि एक वस्तु में कई धागे होने का सबसे अच्छा तरीका क्या है? मैंने एसओ पर भी यह प्रश्न पूछा है, मैं सराहना करता हूं कि क्या आप कुछ प्रकाश (यहां या स्वयं प्रश्न में) बहा सकते हैं
दिनांक

1
@ डैडी: आप परेशानी पूछ रहे हैं। विभिन्न थ्रेड्स के साथ आप जो डेटा साझा करना चाहते हैं, उसे अलग-थलग करना है, इसलिए कई थ्रेड्स का किसी वर्ग के निजी डेटा तक विशेषाधिकार प्राप्त होना एक बुरा विचार है। मैं एक धागे को एक कक्षा के अंदर छिपाता हूं , और मुख्य धागे के लिए डेटा से उस थ्रेड के लिए डेटा को अलग करना सुनिश्चित करता हूं । बेशक, डेटा जिसे साझा किया जाना है, उस वर्ग के सदस्य हो सकते हैं, लेकिन उन्हें अभी भी सिंक्रनाइज़ किया जाना चाहिए (ताले, परमाणु, आदि)। मुझे इस बात पर यकीन नहीं है कि आपके पास कितनी पहुंच है, लेकिन कार्यों / async का उपयोग करना और भी बेहतर है।
पियरसेबल

पियर्सबल का उत्तर स्वीकार किया जाना चाहिए! नाम स्थान + ADL -> stackoverflow.com/questions/6380862/ / के माध्यम से लगभग मानक स्वैप () के लिए बस एक और लिंक
Gob00st

54

बहुत सारे लोग हैं जो मुझसे असहमत होंगे, लेकिन यह है कि मैं इसे कैसे देखता हूं:

एक वर्ग अनिवार्य रूप से एक निश्चित प्रकार की वस्तु की परिभाषा है। स्थैतिक विधियों को उन कार्यों को परिभाषित करना चाहिए जो उस ऑब्जेक्ट परिभाषा में अंतरंग रूप से बंधे हैं।

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

उदाहरण के लिए, अपने मामले में, अपने आप से पूछें, "माईमैथ क्या है?" यदि MyMathएक प्रकार की वस्तु को परिभाषित नहीं करता है, तो मैं कहूंगा: इसे एक वर्ग मत बनाओ।

लेकिन जैसा कि मैंने कहा, मुझे पता है कि ऐसे बहुत से लोग हैं जो (यहां तक ​​कि) भी इस पर मुझसे असहमत हैं (विशेष रूप से, जावा और सी # डेवलपर्स)।


3
इस पर आपका बहुत शुद्ध दृष्टिकोण है। लेकिन व्यावहारिक रूप से, सभी-स्थैतिक तरीकों के साथ एक वर्ग काम में आ सकता है: आप typedefउन्हें, टेम्पलेट मापदंडों के रूप में उपयोग कर सकते हैं, आदि
Shog9

56
यही कारण है कि जुवे और सी # लोगों के पास कोई विकल्प नहीं है।
मार्टिन

7
@ shog9। आप कार्यों के रूप में अच्छी तरह से कर सकते हैं!
मार्टिन यॉर्क

6
@ दान: संभवतः, एक जिसे गणित की दिनचर्या की आवश्यकता थी और वह "अलग-अलग कार्यान्वयन" में "प्लगिंग" का समर्थन करना चाहता था।
शोग

1
@Dan: "मुझे लगता है कि अगर किसी को एक टेम्पलेट पैरामीटर के रूप में एक वर्ग का उपयोग करने में दिलचस्पी है, तो वह वर्ग लगभग निश्चित रूप से कुछ अंतर्निहित वस्तु को परिभाषित कर रहा है।" नहीं, कदापि नहीं। लक्षण के बारे में सोचो। (फिर भी, मैं आपके उत्तर से पूरी तरह सहमत हूं।)
sbi

18
  • यदि आपको स्थैतिक डेटा की आवश्यकता है, तो स्थैतिक तरीकों का उपयोग करें।
  • यदि वे टेम्प्लेट फ़ंक्शंस हैं और आप एक साथ सभी फ़ंक्शंस के लिए टेम्प्लेट पैरामीटर का एक सेट निर्दिष्ट करने में सक्षम होना चाहते हैं, तो टेम्प्लेट क्लास में स्टैटिक विधियों का उपयोग करें।

अन्यथा, नामांकित फ़ंक्शन का उपयोग करें।


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

template<typename T, int decimalPlaces>
class MyMath
{
   // routines operate on datatype T, preserving at least decimalPlaces precision
};

// math routines for manufacturing calculations
typedef MyMath<double, 4> CAMMath;
// math routines for on-screen displays
typedef MyMath<float, 2> PreviewMath;

यदि आपको इसकी आवश्यकता नहीं है, तो हर तरह से एक नाम स्थान का उपयोग करें।


2
तथाकथित स्थिर डेटा नेमस्पेस के कार्यान्वयन फ़ाइल में नाम स्थान स्तर डेटा हो सकता है, इससे युग्मन कम हो जाता है क्योंकि इसे हेडर में दिखाना नहीं पड़ता है।
मोति

स्थैतिक डेटा नामस्थान-स्कोप ग्लोबल्स से बेहतर नहीं है।
कोप्रो

@coppro। वे यादृच्छिक ग्लोबल्स से विकासवादी श्रृंखला के कम से कम एक कदम ऊपर हैं क्योंकि उन्हें निजी बनाया जा सकता है (लेकिन अन्यथा सहमत हैं)।
मार्टिन यॉर्क

@Motti: OTOH, आप अगर चाहते हैडर (इनलाइन / टेम्पलेट कार्यों), आप इसके बारे में बदसूरत होने के लिए वापस में यह।
शोग

1
दिलचस्प उदाहरण, दोहराव से बचने के लिए आशुलिपि के रूप में एक वर्ग का उपयोग करना template!
अंडरस्कोर_ड

13

आपको एक नामस्थान का उपयोग करना चाहिए, क्योंकि एक नाम स्थान के एक वर्ग पर कई फायदे हैं:

  • आपको एक ही हेडर में सब कुछ परिभाषित नहीं करना है
  • आपको हेडर में अपने सभी कार्यान्वयन को उजागर करने की आवश्यकता नहीं है
  • आप usingएक वर्ग के सदस्य नहीं हो सकते ; आप usingएक नाम स्थान के सदस्य हो सकते हैं
  • आप नहीं कर सकते हैं using class, हालांकि, using namespaceएक अच्छा विचार है कि अक्सर नहीं है
  • एक वर्ग का उपयोग करने से तात्पर्य यह है कि जब वास्तव में कोई नहीं है, तब कोई वस्तु बनाई जानी चाहिए

स्थिर सदस्य, मेरी राय में, बहुत अधिक उपयोग किए गए हैं। वे ज्यादातर मामलों में एक वास्तविक आवश्यकता नहीं हैं। स्टैटिक सदस्यों के कार्य संभवतः फ़ाइल-स्कोप फ़ंक्शंस के रूप में बेहतर होते हैं, और स्थैतिक डेटा सदस्य बेहतर, अवांछनीय प्रतिष्ठा वाली वैश्विक वस्तुएं हैं।


3
"आपको हेडर में अपने सभी कार्यान्वयन को उजागर करने की आवश्यकता नहीं है" न तो आप तब करते हैं जब आप एक वर्ग का उपयोग करते हैं।
वनुआन

इससे भी अधिक: यदि आप ऐसे नामस्थानों का उपयोग कर रहे हैं जो आप शीर्षलेख में अपने सभी कार्यान्वयन को उजागर नहीं कर सकते हैं (आप प्रतीकों की एकाधिक परिभाषा के साथ समाप्त हो जाएंगे)। इनलाइन वर्ग-सदस्य फ़ंक्शन आपको ऐसा करने की अनुमति देते हैं।
वानुआन

1
@Vanuan: आप शीर्ष लेख में नाम स्थान कार्यान्वयन को उजागर कर सकते हैं। inlineओडीआर को संतुष्ट करने के लिए बस कीवर्ड का उपयोग करें ।
थॉमस ईडिंग

@ThomasEding की जरूरत नहीं है! = कर सकते हैं
Vanuan

3
@Vanuan: कंपाइलर द्वारा उपयोग किए जाने पर केवल एक चीज की गारंटी है inline, और यह एक फ़ंक्शन के शरीर को "इनलाइनिंग" नहीं करता है। असली की (और मानक की गारंटी) उद्देश्य inlineकई परिभाषाएं को रोकने के लिए है। C ++ के लिए "एक परिभाषा नियम" के बारे में पढ़ें। इसके अलावा, लिंक किए गए SO प्रश्न ODR मुद्दों के बजाय पहले से शीर्षक वाले मुद्दों के कारण संकलन नहीं किया गया था।
थॉमस ईडिंग

3

मैं नाम स्थान पसंद करूंगा, इस तरह आप कार्यान्वयन फ़ाइल में एक अनाम नेमस्पेस में निजी डेटा रख सकते हैं (इसलिए यह शीर्ष लेख में privateसदस्यों के विपरीत नहीं दिखाना है )। एक और लाभ यह है कि usingआपके नाम स्थान के अनुसार तरीकों के ग्राहक निर्दिष्ट से बाहर निकल सकते हैंMyMath::


2
कक्षाओं के साथ कार्यान्वयन फ़ाइल में एक अनाम नेमस्पेस में आपके पास निजी डेटा हो सकता है। मुझे यकीन नहीं है कि मैं आपके तर्क का पालन करूंगा।
पैट्रिक जॉम्नियर

0

वर्ग का उपयोग करने का एक और कारण - पहुंच विनिर्देशक का उपयोग करने का विकल्प। आप संभवतः अपनी सार्वजनिक स्थैतिक विधि को छोटे निजी तरीकों से तोड़ सकते हैं। सार्वजनिक विधि कई निजी तरीकों को कॉल कर सकती है।


6
एक्सेस संशोधक शांत हैं, लेकिन यहां तक ​​कि सबसे अधिक privateविधि एक विधि की तुलना में अधिक सुलभ है, जिसका प्रोटोटाइप हेडर में (और इस प्रकार, अदृश्य रहता है) बिल्कुल भी प्रकाशित नहीं होता है। मैं अनाम नामांकित फ़ंक्शंस द्वारा पेश किए गए बेहतर एनकैप्सुलेशन का भी उल्लेख नहीं कर रहा हूं।
18

2
निजी तरीके हैं, IMO, फ़ंक्शन को छिपाने के लिए कार्यान्वयन (सीपीपी फ़ाइल) में स्वयं को हीन और इसे हेडर फ़ाइल में कभी उजागर नहीं करते हैं। कृपया अपने उत्तर में इस पर विस्तार से बताएं और आप निजी सदस्यों का उपयोग क्यों करना पसंद करेंगे । तब तक -1।
nonsensickle

@nonsensickle शायद उनका मतलब है कि कई बार दोहराए जाने वाले वर्गों के साथ एक मैमथ फ़ंक्शन को सुरक्षित रूप से तोड़ा जा सकता है, जबकि निजी के पीछे के उपसमुदायों को छिपाते हुए, यदि वे खतरनाक हैं, तो उन्हें रोकना होगा।
ट्रोसेफ

1
@ ट्रॉयसेफ़, यहां तक ​​कि आप इस जानकारी को किसी अनाम नेमस्पेस के अंदर .cppफ़ाइल में छिपा सकते हैं, जो हेडर फ़ाइल को पढ़ने वाले किसी भी व्यक्ति को कोई भी शानदार जानकारी दिए बिना उस अनुवाद इकाई को निजी बना देगा। प्रभावी रूप से, मैं PIMPL मुहावरे की वकालत करने की कोशिश कर रहा हूं।
nonsensickle

.cppयदि आप टेम्प्लेट का उपयोग करना चाहते हैं तो आप इसे किसी फ़ाइल में नहीं रख सकते ।
Y29295

0

नाम स्थान और वर्ग विधि दोनों के उपयोग हैं। Namespace फ़ाइलों में फैले होने की क्षमता रखता है, लेकिन यह एक कमजोरी है यदि आपको एक फ़ाइल में जाने के लिए सभी संबंधित कोड लागू करने की आवश्यकता है। जैसा कि ऊपर उल्लिखित वर्ग भी आपको कक्षा में निजी स्थिर सदस्य बनाने की अनुमति देता है। आप इसे कार्यान्वयन फ़ाइल के अनाम नामस्थान में रख सकते हैं, हालांकि यह अभी भी कक्षा के अंदर होने की तुलना में एक बड़ा दायरा है।


कार्यान्वयन फ़ाइल के अनाम नामस्थान में "[भंडारण की चीजें] [है] उन्हें कक्षा के अंदर रखने की तुलना में एक बड़ी गुंजाइश है" - नहीं, यह नहीं है। ऐसे मामलों में जहां सदस्यों को विशेषाधिकार प्राप्त करने की आवश्यकता नहीं है, गुमनाम नाम वाले सामान लोगों की तुलना में अधिक निजीprivate: हैं। और ऐसे कई मामलों में जहां विशेषाधिकार प्राप्त करने की आवश्यकता प्रतीत होती है, उसे समाप्त किया जा सकता है। सबसे 'निजी' फ़ंक्शन वह है जो हेडर में दिखाई नहीं देता है। private:विधियाँ कभी भी इस लाभ का आनंद नहीं ले सकती हैं।
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.