दिलचस्प पोस्ट
ग्रुप द्वारा + केस वक्तव्य जावास्क्रिप्ट पार्सर जावास्क्रिप्ट में पीएचपी आउटपुट एक प्रश्न चिह्न के साथ छोटे काले हीरे दिखाते हैं आर्किटेक्चर i386 के लिए प्रतीक (एस) नहीं मिले I386 विज़ुअल स्टूडियो 2015 रेज़र हाइलाइटिंग नहीं है और न ही इंटेलीज़ेंस एंड्रॉइड लेआउट वज़न SimpleDateFormat का उपयोग करने के लिए स्ट्रिंग को एक तिथि में कनवर्ट कैसे करें? पासवर्ड सत्यापन regex PHP के साथ उपयोगकर्ता इनपुट को सिनिटाइज़ करने का सबसे अच्छा तरीका क्या है? अप्रत्यक्ष विस्तार क्या है? $ {! Var *} क्या मतलब है? कैसे JSF में नेविगेट करने के लिए? यूआरएल कैसे करें वर्तमान पेज को प्रतिबिंबित करें (और पिछला नहीं) फ़ॉर्मेट किए गए बिगडीकेल मान मुद्रित कैसे करें? फ़ंक्शन-स्तरीय स्थैतिक चर कब आबंटित / आरंभ किए जाते हैं? अजाक्स से PHP स्क्रिप्ट के साथ सरणी भेजें इकाई फ़्रेमवर्क: "अपॉइंटमेंट अपडेट, डालें, या हटाएं कथन की एक अप्रत्याशित संख्या (0) से प्रभावित है।"

तू STD :: वेक्टर से वारिस नहीं होगा

ठीक है, यह कबूल करना वास्तव में मुश्किल है, लेकिन मेरे पास std::vector से उत्तराधिकार के लिए इस समय एक मजबूत प्रलोभन है।

मुझे वेक्टर के लिए लगभग 10 अनुकूलित एल्गोरिदम चाहिए और मैं उन्हें सदिश के सीधे सदस्य होना चाहता हूं। लेकिन स्वाभाविक रूप से मैं भी बाकी std::vector के इंटरफेस के पास होना चाहता हूं। ठीक है, मेरा पहला विचार, कानून पालन करने वाला नागरिक के रूप में, MyVector वर्ग में एक std::vector सदस्य था। लेकिन तब मुझे मैन्युअल रूप से सभी std :: vector के इंटरफ़ेस को पुन: प्रदान करना होगा। टाइप करने के लिए बहुत ज्यादा इसके बाद, मैंने निजी विरासत के बारे में सोचा, ताकि नियमों को दोबारा देने के बजाय मैं सार्वजनिक खंड में using std::vector::member का using std::vector::member एक गुच्छा लिखूंगा। यह वास्तव में बहुत थकाऊ है

और यहां मैं हूं, मैं सचमुच सोचता हूं कि मैं सिर्फ सार्वजनिक रूप से std::vector से प्राप्त कर सकता हूं, लेकिन दस्तावेज में एक चेतावनी प्रदान कर सकता हूं कि इस वर्ग को पॉलिमोरफिक रूप से इस्तेमाल नहीं किया जाना चाहिए मुझे लगता है कि अधिकांश डेवलपर्स यह समझने में सक्षम हैं कि इसका उपयोग पॉलिमोरफाईकी का उपयोग नहीं किया जाना चाहिए।

क्या मेरा निर्णय बिल्कुल अनुचित है? यदि हां, तो क्यों? क्या आप एक विकल्प प्रदान कर सकते हैं जो कि अतिरिक्त सदस्यों को वास्तव में सदस्यों के पास होगा, लेकिन वेक्टर के सभी इंटरफेस को पुनः टाइप करना शामिल नहीं होगा? मुझे संदेह है, लेकिन अगर आप कर सकते हैं, तो मैं सिर्फ खुश रहूंगा।

इसके अलावा, तथ्य के अलावा कि कुछ बेवकूफ ऐसा कुछ लिख सकते हैं

 std::vector<int>* p = new MyVector 

क्या MyVector का उपयोग करने में कोई अन्य वास्तविक जोखिम है? यथार्थवादी कहकर मैं एक समारोह की कल्पना की तरह चीजें त्याग देता हूं जो संकेतक को वेक्टर लेता है …

खैर, मैंने अपना मामला कहा है। मैंने पाप किया है। अब यह आप पर निर्भर है कि मुझे माफ कर दो या नहीं 🙂

वेब के समाधान से एकत्रित समाधान "तू STD :: वेक्टर से वारिस नहीं होगा"

वास्तव में, std::vector सार्वजनिक उत्तराधिकार में कुछ भी गलत नहीं है अगर आपको इसकी ज़रूरत है, तो ऐसा करो।

मैं ऐसा करने का सुझाव देता हूं कि केवल अगर यह वास्तव में जरूरी है केवल तभी जब आप मुफ्त कार्यों के साथ क्या चाहते हैं (उदाहरण के लिए कुछ राज्य रखना चाहिए)।

समस्या यह है कि MyVector एक नई इकाई है इसका मतलब है कि एक नया सी ++ डेवलपर को यह जानना चाहिए कि इसका उपयोग करने से पहले नरक क्या है। std::vector और MyVector बीच अंतर क्या है? कौन सा बेहतर है कि यहां और वहां उपयोग किया जाए? यदि मुझे std::vector को MyVector स्थानांतरित करने की आवश्यकता है तो क्या होगा? क्या मैं सिर्फ swap() उपयोग करता हूं या नहीं?

बेहतर बनाने के लिए कुछ बनाने के लिए नई संस्थाएं न बनाएं ये संस्थाएं (विशेषकर, ऐसे सामान्य) निर्वात में नहीं रहेंगी। वे लगातार वृद्धि हुई एन्ट्रापी के साथ मिश्रित वातावरण में रहेंगे।

पूरे एसटीएल को ऐसे तरीके से डिज़ाइन किया गया है कि एल्गोरिदम और कंटेनर अलग-अलग हैं

इसने विभिन्न प्रकार के इटरेटरों की एक अवधारणा को जन्म दिया: कंसट्रेटरेटर, रैंडम एक्सेस इटरेटर्स आदि।

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

इसके अलावा, मुझे आपको जेफ एटवुड की कुछ अच्छी टिप्पणियों में भेजना चाहिए

सार्वजनिक रूप से std :: vector से वंशानुक्रम न होने का मुख्य कारण वर्चुअल डिस्ट्रक्टर की अनुपस्थिति है जो वंश के बहुरूपता के उपयोग से आपको प्रभावी ढंग से रोकता है। विशेष रूप से, आपको एक std::vector<T>* को delete की अनुमति नहीं है जो वास्तव में एक व्युत्पन्न ऑब्जेक्ट पर इंगित करता है (भले ही व्युत्पन्न वर्ग कोई सदस्य नहीं जोड़ता है), फिर भी संकलक आम तौर पर आप इसके बारे में चेतावनी नहीं दे सकते।

इन शर्तों के तहत निजी विरासत की अनुमति है इसलिए मैं निजी विरासत का उपयोग करने की सलाह देता हूं और नीचे दिखाए गए अनुसार माता-पिता से आवश्यक तरीकों को आगे बढ़ाया है।

 class AdVector: private std::vector<double> { typedef double T; typedef std::vector<double> vector; public: using vector::push_back; using vector::operator[]; using vector::begin; using vector::end; AdVector operator*(const AdVector & ) const; AdVector operator+(const AdVector & ) const; AdVector(); virtual ~AdVector(); }; 

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

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

 struct MyVector { std::vector<Thingy> v; // public! void func1( ... ) ; // and so on } 

यह सभी संभव भूलों को दूर करेगा जो गलती से आपके मायवेटक क्लास को ऊपर उठाने से बाहर आ सकते हैं, और आप अभी भी थोड़े से जोड़कर सभी वेक्टर ऑप्स तक पहुंच सकते हैं।

आप क्या हासिल करने की उम्मीद कर रहे हैं? बस कुछ कार्यक्षमता प्रदान?

ऐसा करने के लिए सी ++ मुहावरेदार तरीका यह है कि फ़ंक्शंस को कार्यान्वित करने वाले कुछ मुफ्त कार्यों को लिखना है। संभावना है कि आपको वास्तव में एक स्टडी :: वेक्टर की आवश्यकता नहीं है, विशेष रूप से आप कार्यान्वित करने वाली कार्यक्षमता के लिए, जिसका अर्थ है कि आप वास्तव में std :: vector से उत्तराधिकार की कोशिश कर पुन: प्रयोज्यता को खो रहे हैं।

मैं आपको सलाह देता हूं कि आप मानक लाइब्रेरी और हेडर देख सकें, और कैसे वे काम करते हैं पर ध्यान दें।

मुझे लगता है कि बहुत कम नियमों का समय आंशिक रूप से 100% का पालन करना चाहिए। ऐसा लगता है जैसे आपने इसे काफी विचार दिया है, और यह आश्वस्त है कि यह रास्ता तय करना है। तो – जब तक कोई अच्छा कारण नहीं उठाता है, ऐसा करने के लिए नहीं – मुझे लगता है कि आपको अपनी योजना के साथ आगे बढ़ना चाहिए

std::vector से वारिस का कोई कारण नहीं है, जब तक कि कोई ऐसा वर्ग नहीं बनाना चाहता है जो std::vector से भिन्न तरीके से काम करता है, क्योंकि यह अपने तरीके से std::vector की परिभाषा के छुपा विवरण, या जब तक कोई है std::vector स्थान पर ऐसे वर्ग की वस्तुओं का उपयोग करने के लिए वैचारिक कारण हालांकि, सी ++ पर मानक के रचनाकारियों ने किसी भी इंटरफेस (संरक्षित सदस्यों के रूप में) के साथ std::vector प्रदान नहीं किया था, जो कि एक विशिष्ट तरीके से सदिश को सुधारने के लिए ऐसे विरासत वर्ग का फायदा उठा सकता था। दरअसल, उनके पास किसी भी विशिष्ट पहलू के बारे में सोचने का कोई तरीका नहीं था, जिसे विस्तार या ठीक-ठाक अतिरिक्त कार्यान्वयन की आवश्यकता हो सकती है, इसलिए उन्हें किसी भी उद्देश्य के लिए ऐसा कोई इंटरफ़ेस प्रदान करने की आवश्यकता नहीं है।

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

यदि आप अच्छा सी ++ शैली का पालन करते हैं, तो आभासी फ़ंक्शन की अनुपस्थिति समस्या नहीं है, लेकिन टुकड़ा करने की क्रिया ( https://stackoverflow.com/a/14461532/877329 देखें )

क्यों आभासी कार्यों की अनुपस्थिति समस्या नहीं है? क्योंकि किसी फ़ंक्शन को प्राप्त होने वाले किसी भी सूचक को delete कोशिश नहीं करनी चाहिए, क्योंकि इसमें इसका स्वामित्व नहीं है। इसलिए, सख्त स्वामित्व नीतियों का पालन करते समय, वर्चुअल डिस्ट्रक्टर्स की आवश्यकता नहीं होनी चाहिए। उदाहरण के लिए, यह हमेशा गलत होता है (वर्चुअल डिस्ट्रक्टर के साथ या बिना):

 void foo(SomeType* obj) { if(obj!=nullptr) //The function prototype only makes sense if parameter is optional { obj->doStuff(); } delete obj; } class SpecialSomeType:public SomeType { // whatever }; int main() { SpecialSomeType obj; doStuff(&obj); //Will crash here. But caller does not know that // ... } 

इसके विपरीत, यह हमेशा (वर्चुअल डिस्ट्रक्टर के साथ या बिना) काम करेगा:

 void foo(SomeType* obj) { if(obj!=nullptr) //The function prototype only makes sense if parameter is optional { obj->doStuff(); } } class SpecialSomeType:public SomeType { // whatever }; int main() { SpecialSomeType obj; doStuff(&obj); // The correct destructor *will* be called here. } 

यदि वस्तु किसी कारखाने के द्वारा बनाई जाती है, तो कारखाने को एक कामकाजी विदागार को भी वापस करना चाहिए, जिसका उपयोग delete बजाय किया जाना चाहिए, क्योंकि कारखाना अपनी हीप का उपयोग कर सकता है। कॉलर इसे एक share_ptr या unique_ptr का रूप प्राप्त कर सकता है संक्षेप में, कुछ भी नहीं delete जिसे आप सीधे new से नहीं प्राप्त कर पाए।

व्यावहारिक रूप से: यदि आपके व्युत्पन्न वर्ग में आपके पास कोई डाटा सदस्य नहीं है, तो आपको कोई समस्या नहीं है, यहां तक ​​कि पॉलीमॉर्फिक उपयोग में भी नहीं। यदि आपको बेस क्लास के आकार और व्युत्पन्न वर्ग अलग-अलग हैं और / या आपके पास वर्चुअल फ़ंक्शंस (जिसका अर्थ है v-table), आपको केवल वर्चुअल डिस्ट्रक्टर की आवश्यकता है

लेकिन सिद्धांत में: C ++ 0x एफसीडी में [expr.delete] से: पहले ऑब्जेक्ट में (ऑब्जेक्ट हटाएं), अगर ऑब्जेक्ट के स्थैतिक प्रकार को इसके डायनामिक प्रकार से अलग किया जाता है, तो स्टैटिक टाइप एक होगा ऑब्जेक्ट के डायनेमिक प्रकार के बेस क्लास को हटाया जाना और स्थैतिक प्रकार का वर्चुअल डिस्ट्रक्टर होगा या उसका व्यवहार अनिर्धारित है।

लेकिन आप समस्याओं के बिना std :: vector से निजी तौर पर प्राप्त कर सकते हैं। मैंने निम्नलिखित पैटर्न का इस्तेमाल किया है:

 class PointVector : private std::vector<PointType> { typedef std::vector<PointType> Vector; ... using Vector::at; using Vector::clear; using Vector::iterator; using Vector::const_iterator; using Vector::begin; using Vector::end; using Vector::cbegin; using Vector::cend; using Vector::crbegin; using Vector::crend; using Vector::empty; using Vector::size; using Vector::reserve; using Vector::operator[]; using Vector::assign; using Vector::insert; using Vector::erase; using Vector::front; using Vector::back; using Vector::push_back; using Vector::pop_back; using Vector::resize; ... 

मुझे हाल ही में std::vector से विरासत में मिला है, और यह बहुत उपयोगी हो पाया और अब तक मैंने इसके साथ कोई समस्या नहीं अनुभव की है।

मेरा वर्ग एक विरल मैट्रिक्स वर्ग है, जिसका अर्थ है कि मुझे अपने मैट्रिक्स तत्व को कहीं न कहीं, अर्थात std::vector में संग्रहीत करने की आवश्यकता है। इनहेरिटमेंट के लिए मेरा कारण यह था कि मैं सभी तरीकों के लिए इंटरफेस लिखने के लिए थोड़ा सा आलसी था और मैं std::vector के लिए पहले से ही अच्छा इंटरफ़ेस कोड है जहां SWIG के माध्यम से पायथन को क्लास में अंतर कर रहा हूँ। मुझे इस इंटरफ़ेस कोड का विस्तार करने के लिए अपने कक्षा में एक नए एक को स्क्रैच से लिखने के बजाय अधिक आसानी से मिला।

एकमात्र समस्या जो दृष्टिकोण के साथ मैं देख सकता हूँ वह गैर-वर्चुअल डिस्ट्रक्टर के साथ नहीं है, बल्कि कुछ अन्य विधियों, जिसे मैं ओवरलोड करना चाहता हूं, जैसे कि push_back() , resize() , insert() आदि निजी विरासत वास्तव में एक अच्छा विकल्प हो सकता है

धन्यवाद!

हां, यह तब तक सुरक्षित है जब तक आप सावधान नहीं रहें जो सुरक्षित नहीं हैं … मुझे नहीं लगता कि मैंने कभी किसी को नए अभ्यास के साथ एक वेक्टर का उपयोग देखा है, तो आप ठीक हो सकते हैं। हालांकि, यह आम मुहावरा सी ++ में नहीं है ….

क्या आप एल्गोरिदम के बारे में अधिक जानकारी दे सकते हैं?

कभी-कभी आप एक डिज़ाइन के साथ एक सड़क के नीचे जा रहे हैं और फिर आप उन अन्य रास्तों को नहीं देख सकते जिन्हें आप ले सकते हैं – तथ्य यह है कि आप 10 नए एल्गोरिदम के साथ वेक्टर की जरूरत का दावा करते हैं मेरे लिए अलार्म गड़गड़ाहट – क्या वास्तव में 10 सामान्य उद्देश्य हैं एल्गोरिदम एक वेक्टर लागू कर सकते हैं, या क्या आप ऐसे ऑब्जेक्ट बनाने की कोशिश कर रहे हैं जो एक सामान्य प्रयोजन वेक्टर है और जिसमें एप्लिकेशन विशिष्ट फ़ंक्शन होते हैं?

मैं निश्चित रूप से यह नहीं कह रहा हूं कि आपको ऐसा नहीं करना चाहिए, यह सिर्फ इतना है कि आपने जो अलार्म घंटियाँ दी हैं, वे बज रहे हैं जिससे मुझे लगता है कि आपके अबाधियों में कुछ गलत है और आपको क्या हासिल करने का एक बेहतर तरीका है चाहते हैं।