2010-06-18 8 views
5

लेकिन मुझे नहीं पता कि मुझे स्थिर तरीकों, केवल एक शीर्षलेख, कक्षा, या कुछ और के लिए जाना चाहिए?सी ++: उपयोगिता वर्ग कैसे डिज़ाइन करें?

सर्वोत्तम अभ्यास क्या होगा? लेकिन, मैं एक उपयोगिता वर्ग का उदाहरण नहीं चाहता हूं।

मैं जैसे कार्यों जोड़ना चाहते हैं:

Uint32 MapRGB (int r, int g, int b); 
const char* CopyString(const char* char); 
// etc. You know: utility methods... 
+2

कॉपीस्ट्रिंग() संदिग्ध लग रहा है - यह क्या करेगा? –

+0

@Neil: एक स्ट्रिंग को ढेर में कॉपी करना, इसलिए यह दायरे से बाहर नहीं होगा ... –

+8

किसी भी परिस्थिति में ऐसा नहीं है - यह लगभग गारंटीकृत स्मृति रिसाव है। Std :: स्ट्रिंग का प्रयोग करें। –

उत्तर

21

उन्हें एक वर्ग में डाल मत करो; बस उन्हें नामस्थान स्कोप पर गैर-सदस्य कार्य करें।

कोई नियम नहीं है कि प्रत्येक कार्य को कुछ वर्ग का सदस्य कार्य होना चाहिए।

+0

@ जेम्स: ओह, एक नामस्थान। शायद बुरा नहीं ... क्या आप थोड़ा कोड उदाहरण दे सकते हैं? –

+0

कुछ दुकानें नामस्थानों पर कक्षाएं पसंद करती हैं क्योंकि यह अधिक 'जावा जैसी' है। * श्वास * –

+3

@ मार्टिजन: मैं [परिभाषित सी ++ पुस्तक गाइड और सूची] में सूचीबद्ध प्रारंभिक पुस्तकों में से एक प्राप्त करने की अनुशंसा करता हूं (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide -और-सूची)। प्रभावी रूप से, कोड आपके प्रश्न में दिखाए जा सकते हैं, और यदि आप चाहते हैं कि आप चाहते हैं या आप की जरूरत है तो कार्यों को नामस्थान में रख सकते हैं। –

1

यदि संभवतः वे कक्षा से संबंधित नहीं हैं तो कक्षाओं को इन कार्यों को लपेटने का कोई कारण नहीं है। उस स्थिति में आप उन्हें मुफ्त कार्य कर सकते हैं। नाम टक्कर से बचने में मदद के लिए उन्हें नामस्थान में रखना उचित हो सकता है।

आप कक्षाओं का एक स्ट्रिंगर के तर्कसंगत समूहन प्रदान करने के लिए चाहते हैं, तो उन्हें एक वर्ग के स्थिर सदस्य कार्यों हो होने में कोई वास्तविक नुकसान है - लेकिन मैं कोई कारण नहीं क्यों आप MapRGB() जैसे कार्यों होगा और CopyString() होने की जरूरत को देखने के एक ही कक्षा के सदस्य।

3

एक कारक यह है कि उन्हें कक्षा में भी रखा जाए, या उन्हें नामस्थान में नामांकित करें (जावा में, आपको कक्षा का उपयोग करना होगा, लेकिन सी ++ नामस्थान प्रदान करता है)।

आप इसे एक वर्ग के सदस्य करते भी हैं, तो सबसे महत्वपूर्ण निर्णय आप प्रत्येक कार्य के बारे में बनाने के लिए है कि क्या यह आवश्यकता होगी या किसी राज्य कि प्राप्त या नहीं पहुंचेगी एक अपने मापदंडों और वापसी मान के माध्यम से प्रभावित करना चाहिए है। यदि ऐसा नहीं होता है, तो इसे static बनाया जाना चाहिए, क्योंकि आप "इस" छिपे तर्क का उपयोग नहीं करेंगे।

नामस्थान के बजाय कक्षा का उपयोग करने के लिए एक तर्क यह है कि यदि आपकी उपयोगिता कक्षा को इसके कार्यान्वयन के लिए अतिरिक्त विधियों का आह्वान करने की आवश्यकता हो सकती है (उदाहरण के लिए, पुनरावर्तन, जटिल गणना आदि के मामले में)। फिर आप अपनी विधि static public बना सकते हैं, और कुछ भी इसे static private पर लागू किया जा सकता है। सी ++ का उपयोग करने के बाद से कई सालों रहे हैं, लेकिन मुझे नहीं लगता कि आप नामस्थान में गैर-सदस्य कार्यों को "छिपा" सकते हैं (अगर मैं गलत हूं तो कोई मुझे सही करेगा)।

फ़ंक्शन इंटरफ़ेस को डिज़ाइन करने के संदर्भ में, तर्कों की संख्या पर विचार करें। यदि बहुत से आने वाले तर्क हैं (विशेष रूप से यदि वे समान प्रकार के हैं और कुछ संबंधित हैं), तो आप कई तर्कों को पारित करने के बजाय अतिरिक्त प्रकारों का उपयोग करने पर विचार करना चाहेंगे। उदाहरण के लिए, calculateVolume(int x, int y, int z) के बजाय, आप calculateVolume(Point3D) जैसे कुछ करना चाह सकते हैं। इसी तरह, आपके मामले में, एक आरजीबी कक्षा का उपयोग करें। यह मूर्खतापूर्ण प्रतीत हो सकता है, लेकिन यह कुछ परेशान त्रुटियों को बचा सकता है (उदाहरण के लिए, यदि आपके पास इन्ट्स और आरजीबी लेने वाले फ़ंक्शन हैं), और समय (यदि आपको अन्य कार्यों में मानों को पास करना है)। तर्कों को पार करते समय इन प्रकारों को बनाने के लिए आप एक स्थिर फैक्ट्री विधि बना सकते हैं। उदाहरण के लिए: doSomethingWithColor(RGB.create(20,30,40))

+1

+1 - स्थिर अच्छे उत्तर को इंगित करने के लिए! – JonH

+2

यदि किसी गैर-सदस्य फ़ंक्शन को .cpp फ़ाइल में कार्यान्वित किया गया है, तो उसके लिए आवश्यक किसी भी फ़ंक्शन को, लेकिन जिसे प्रकट नहीं किया जाना चाहिए उसे उस .cpp फ़ाइल (या स्थिर बना दिया गया) में एक अनाम नामस्थान में रखा जा सकता है। यदि आपके पास फ़ंक्शन टेम्पलेट्स हैं, तो यह ट्रिकियर है, क्योंकि उनका कार्यान्वयन हेडर फ़ाइल में ही होना चाहिए, लेकिन आम तौर पर यह "विस्तार" नामस्थान के साथ काम करता है जिसमें गैर-सार्वजनिक कार्यक्षमता जाती है। यह दृष्टिकोण है कि बूस्ट में से अधिकांश लेता है। –

+0

@ जेम्स: धन्यवाद जेम्स ... – Uri

1

यदि आप सिर्फ एक साथ कार्यों को समूहबद्ध करना चाहते हैं, लेकिन समूह का उदाहरण नहीं बनाते हैं, तो आपको शायद उन्हें कक्षा के बजाय नामस्थान में डालने की सोच करनी चाहिए।

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

1

मेरे पास आम तौर पर "उपयोग" नामक एक "ए (.lib) होता है जिसे" उपयोग "कहा जाता है। हालांकि, आमतौर पर" उपयोग "वर्ग खराब समाचार होता है, और यह एक निर्भरता पेश करता है जो मानक ऑब्जेक्ट उन्मुख डिज़ाइन को तोड़ देता है। अब, यदि आप किसी भिन्न प्रोजेक्ट में पुन: उपयोग करने के लिए कक्षा खींचने का प्रयास करते हैं, तो आपके पास अपनी उपयोग लाइब्रेरी पर हजारों छिपी निर्भरताएं हैं। असल में, यह उपयोगी है, लेकिन वहां चीजों को रखने से बचने के लिए अपनी पूरी कोशिश करें।

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