2010-08-19 11 views
5

मैं वर्तमान में आम कार्यों (खोज एल्गोरिथ्म कार्यान्वयन) का एक सेट का निर्माण कर रहा हूँ, और लगता है कि मैं गलत कर रहा हूँ समूहीकरण।स्थिर कार्यों को पकड़ने के लिए सी ++ में एक कंटेनर 'चीज़' बनाना। 'चीज' क्या होनी चाहिए?

#ifndef SORTING_H 
#define SORTING_H 

#include <vector> 

class Sorting { 

private: 
    Sorting(); 
    Sorting(const Sorting& orig); 
    virtual ~Sorting(); 

public: 
    static void bubbleSort(std::vector<int>& A); 
    // etc 
}; 

#endif /* SORTING_H */ 

अब, क्योंकि निर्माता निजी है, एक उपयोगकर्ता: पल में, मैं एक वर्ग, सॉर्टिंग, कि Sorting.h (यह कहीं नहीं के पास अभी तक समाप्त हो, Btw) तो जैसे नामक एक फ़ाइल में घोषित किया जाता है है मेरी कक्षा को तुरंत चालू नहीं कर सकता - यह प्रभावी रूप से स्थिर कार्यों के लिए एक धारक है जिसे उपयोगकर्ता कॉल कर सकते हैं। हालांकि, मैंने अब तक सी ++ के बारे में जो पढ़ा है - और एसटीएल पुस्तकालयों को देखने से- मुझे लगता है कि मैं यह गलत कर रहा हूं। क्या मुझे इसके बजाय 'सॉर्टिंग' या किसी प्रकार का नाम नामक नामस्थान होना चाहिए? यदि हां, तो मेरे हेडर फ़ाइल (जिसे उपयोगकर्ता शामिल करेगा) जैसा दिखता है? और क्या मुझे बाकी फाइलों की संरचना बदलनी होगी? फिलहाल एल्गोरिदम का प्रत्येक सेट इसकी स्वयं की सीपीपी फ़ाइल में है (यानी BubbleSort.cpp, CocktailSort.cpp, आदि)।

डुप्लीकेट प्रश्न क्या हो सकता है इसके लिए माफ़ी - मैंने सी ++ और नेमस्पेस की खोज की, लेकिन मुझे नामस्थानों के बारे में बहुत सामान्य प्रश्न मिल गए और कोई भी यह विशिष्ट समस्या नहीं लग रहा था।

उत्तर

4

एक नाम स्थान का प्रयोग करें। कोड के कॉलर्स को परवाह करने की आवश्यकता नहीं होगी। साथ ही, आपको किसी भी क्रमबद्ध प्रकार पर टेम्पलेट की आवश्यकता होती है- एक प्रकार जो केवल पूर्णांक के वेक्टर को सॉर्ट कर सकता है बल्कि खराब है। Std :: sort द्वारा प्रदान की गई परिभाषा पर चिपकाएं।

namespace Sorting { 
    template<typename Iterator> void cocktail_sort(Iterator a, Iterator b) { 
     // implement cocktail sort 
    } 
    template<typename Iterator> void bubble_sort(Iterator a, Iterator b) { 
     // implement bubble sort 
    } 
}; 

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

+0

'(इटरेटर पहले इटरेटर पिछले)', उदाहरण के लिए। – Potatoswatter

+0

धन्यवाद। मैं जल्द ही टेम्पलेट्स पर जाने जा रहा हूं, मैं यह जानने का प्रयास कर रहा था कि आप कैसे बताते हैं कि एक टेम्पलेटेड क्लास/आदिम सी ++ में तुलनीय है या नहीं - यानी मुझे कैसे पता चलेगा कि यह काम करेगा जब यह "<" आदि पर कॉल किया जाएगा। या यह है कि अंत उपयोगकर्ता को चिंतित होना चाहिए? एक और सवाल के रूप में - यहां आपने उसी नामस्थान घोषणा में कॉकटेल_सॉर्ट और बबल_सॉर्ट रखा है - क्या मैं इसके लिए कई अलग-अलग फाइलों का उपयोग कर सकता हूं? – Stephen

+0

@DeadMG: दो सुझाव: 1. प्रकार के नाम आमतौर पर आवश्यक प्रकार के इटरेटर्स का वर्णन करते हैं, उदा। 'RandomAccessReadableWriteableIterator' या' ForwardReadableWriteableIterator'। 2. पुनरावृत्तियों के विकल्प के रूप में, आप श्रेणियों का उपयोग कर सकते हैं, जो अधिक लचीला और उपयोग करने में आसान हैं। – Philipp

1

यह कोई फर्क नहीं पड़ता, एक नाम स्थान में एक नि: शुल्क समारोह में एक ही प्राप्त होता है। इसे कॉल करने के लिए वाक्यविन्यास समान है।

0

मैं एक नाम स्थान का उपयोग कर यदि वर्ग instantiated जा करने के लिए नहीं है की सिफारिश करेंगे।

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