क्यूटी-सी ++ बनाम जेनेरिक सी ++ और एसटीएल [बंद]


19

Ubuntu CQ पर, मेरे C ++ पर हाल ही में ब्रश किया गया। मुझे सब कुछ के लिए क्यूटी ढांचे से प्यार है, विशेष रूप से जीयूआई का निर्माण। पिछले कुछ वर्षों में PyQt का उपयोग करते समय मैं इससे काफी परिचित हुआ।

PyQt का उपयोग करते समय, मेरे पास कुछ ऐसे मुद्दे थे जो अब C ++ के साथ Qt का उपयोग करते समय अधिक स्पष्ट होते हैं: Qt में C ++ के कई एक्सटेंशन हैं जो Qt विशिष्ट हैं - QString केवल एक सामान्य उदाहरण है, स्वचालित कचरा संग्रह का उल्लेख नहीं करने के लिए। C ++ और STL के बारे में अधिक जानकारी के बिना C ++ का उपयोग करके Qt एप्लिकेशन लिखना संभव है।

मुझे जल्द ही नौकरी के बाजार पर फिर से प्रहार करना पड़ सकता है और मैं सी ++ पदों पर विचार करने में सक्षम होना चाहता हूं - लेकिन मैं खुद से बहुत डरता हूं कि क्यूटी को जेनेरिक सी ++ के साथ काम करने की मेरी क्षमताओं को सीमित कर देगा, जो एक बार काफी दुर्जेय थे लेकिन अब लंबे निष्क्रिय और जंग खा रहे हैं।

क्या मुझे Qt से बचना चाहिए? क्या मैं GUI के निर्माण के लिए WxWidgets या GTK ++ का उपयोग करना बेहतर होगा?

जेसीआई सी ++ और एसटीएल के सबसे अधिक उपयोग की अनुमति देता है / उपयोग करने के लिए सबसे अच्छा जीयूआई ढांचा क्या है? जब मैं GUI चौखटे, आदि की बात आती है, तो मैं C ++ प्रोग्रामर के रूप में खुद को सबसे अधिक बिक्री योग्य कैसे बनाऊं?

जवाबों:


15

मैं सिर्फ उन कारणों के लिए क्यूटी का उपयोग करने से बचना नहीं चाहूंगा। आपको क्यूटी के सभी उपयोगिता वर्गों का उपयोग करने की आवश्यकता नहीं है; उन लोगों के लिए जो एसटीएल की जगह लेते हैं, आप सबसे अधिक QString और संभवतः, QStringList का उपयोग करने के लिए मजबूर होंगे। इसके अलावा, GUI की तुलना में आमतौर पर एक कार्यक्रम के लिए बहुत अधिक है। आप हमेशा अपने प्रोग्राम के बाकी हिस्सों के लिए विशेष रूप से जेनेरिक C ++ का उपयोग कर सकते हैं, और केवल GUI के लिए Qt का उपयोग कर सकते हैं।

मेरी राय में, एसटीएल के साथ काम करना यह समझने के बारे में है कि अंतर्निहित डेटा संरचनाओं का उपयोग क्या किया जाता है और उनकी जटिलताएं, और परिणामस्वरूप, जिस समय आपको प्रत्येक कंटेनर का उपयोग करना चाहिए। और जब यह सी ++ प्रोग्रामिंग की बात आती है, तो यह विशेष रूप से यह जानने के बारे में है कि बहुत आवश्यक <एल्गोरिथम> हेडर का उपयोग कैसे किया जाए, जो कि क्यूटी के कंटेनरों पर भी काम करना चाहिए, क्योंकि वे एसटीएल-संगत हैं।

मुझे उन सभी एक्सटेंशन Qt प्रदान करने में बहुत नुकसान नहीं दिखता है, जब तक आप जानते हैं (या कम से कम एक सामान्य विचार है) कि वे आंतरिक रूप से कैसे लागू होते हैं। सुनिश्चित करें कि आप जानते हैं कि Q_OBJECT, SIGNAL (), SLOT (), foreach () जैसी चीजें जादू नहीं हैं, लेकिन मैक्रोज़ जो मान्य C ++ स्टेटमेंट में विस्तार करते हैं। उदाहरण के लिए, यह समझना जटिल नहीं है कि Qt को जावा और अधिक महसूस करने वाले अंतर्निहित साझा वर्ग और अभिभावक-बाल संबंध कैसे लागू होते हैं। आप हमेशा एक अलग परियोजना में कुछ कार्यक्षमता को फिर से बनाने की कोशिश कर सकते हैं बस यह देखने के लिए कि क्या आप इसे सामान्य सी ++ के साथ कर सकते हैं, और फिर क्यूटी में उनका उपयोग करने के लिए बुरा नहीं लग रहा है।

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

यदि आप C ++ के साथ काम करने वाले जॉब मार्केट को हिट करते हैं, तो संभावना है कि आप Qt या किसी अन्य फ्रेमवर्क के साथ काम करने जा रहे हैं, जो इसके समान है, इसकी अपनी उपयोगिता कक्षाएं होंगी जो C ++ को सरल बनाने की कोशिश करेंगी।


4
+1 के लिए "आप हमेशा अपने प्रोग्राम के बाकी हिस्सों के लिए विशेष रूप से जेनेरिक C ++ का उपयोग कर सकते हैं, और केवल GUI के लिए Qt का उपयोग कर सकते हैं।"
एमडी महबूबुर्रहमान

@ महबूबुर्रहमान - हाँ - यह उत्कृष्ट सलाह है। केवल GUI के लिए Qt का उपयोग करें और बैक में हुक करने के लिए क्या आवश्यक है। जेनेरिक सी ++, एसटीएल, बूस्ट का उपयोग करके बाकी लिखें - जो उपकरण सार्वभौमिक रूप से उपयोग किए जाते हैं।
वेक्टर

5

मैं Qt की अधिकांश उच्च प्रशंसा से सहमत हूं, लेकिन सवाल यह था कि सामान्य जीयूआई का उपयोग करने के लिए सबसे अच्छा जीयूआई ढांचा क्या है / जेनेरिक सी ++ और एसटीएल के सबसे अधिक उपयोग की आवश्यकता है? इस संबंध में Qt थोड़ा सा स्किज़ोफ्रेनिक है: यह एसटीएल कंटेनरों और एल्गोरिदम को डुप्लिकेट करता है, जिसमें यह खुद का ट्विस्ट होता है। यह कंटेनरों को भी प्रदान करता है, जो एसटीएल से अलग हैं। क्यूटी और एसटीएल के बीच इंटरऑपरेबिलिटी हमेशा आसान सेलिंग नहीं होती है। कुछ मामलों में यह से लाने के लिए कुछ फ़ंक्शन कॉल लेता std::stringकरने के लिए QStringऔर वापस।

wxWidgets में एसटीएल बिल्ड का विकल्प होता है, जो एसटीएल कंटेनरों का विशेष रूप से उपयोग करता है - क्यूटी के मामले में घर के बदले हुए प्रतिस्थापन के साथ कोई समानांतर ब्रह्मांड नहीं है। यह गैर-मानक एक्सटेंशन की आवश्यकता के बिना एक मानक C ++ कंपाइलर के साथ भी संकलित करता है। यह एक गुणवत्ता वाला जीयूआई ढांचा है जो विचार करने लायक है।

आप एक gtkmm भी देख सकते हैं, जो GTK + के आसपास C ++ आवरण है। यह Qt की तुलना में आपकी पहली आवश्यकता को पूरा करने के करीब है।


1
'wxWidgets में STL बिल्ड के लिए एक विकल्प है, जो STL कंटेनरों का विशेष रूप से उपयोग करता है ...' - मैं देखता हूं - यह जानना महत्वपूर्ण है। 'कुछ मामलों में इसे std :: string से QString में लाने के लिए कुछ फंक्शन कॉल लगते हैं - समझ में आया - मैंने अभी तक इसकी जांच नहीं की है। मैं GTK और Wx से थोड़ा परिचित हूं - लेकिन Qt तुलना में चमकने लगता है, कम से कम मेरे नजरिए से - C ++ मेरी पहली भाषा नहीं है - मैं क्लिपर / डेल्फी दुनिया से आया और फिर C ++ सीखा क्योंकि मुझे जीत से निपटना था 32s आदि
वेक्टर

2

मैं एसटीडी जैसे विशिष्ट एसटीएल लाइब्रेरी का उपयोग नहीं करने के बारे में बहुत अधिक चिंता नहीं करूंगा: स्ट्रिंग या स्ट्रिंग :: आईओस्ट्रीम या एसटी :: वेक्टर। क्यूटी-समतुल्य एक अलग स्वाद में आते हैं लेकिन वे किसी भी समस्या को दूर करने के लिए इतने दूर नहीं हैं।

मेरी राय में अधिक मुहावरेदार अंतर newआवंटन के लिए उपयोग करने पर प्रोग्रामिंग शैली को भारी लगता है । क्यूटी प्रोग्राम के लिए यह गुई भाग के लिए ठीक हो सकता है, C ++ और RAII का गुण यह है कि आप ढेर के बजाय ढेर सारे डेटा को वास्तव में रख सकते हैं। गैर-जीयूआई कोड लिखने पर स्विच करते समय आपको यह याद रखना चाहिए।


1
मैं जिस बिंदु को बनाने की कोशिश कर रहा था वह यह नहीं है कि ढेर आवंटन आम तौर पर खराब है, यह स्थानीय चर के लिए सबसे अच्छी बात नहीं है। जीयूआई कक्षाएं लंबे समय तक रहती हैं और ढेर पर स्थानीय रूप से आवंटित की जाती हैं, स्थानीय चर जो केवल अस्थायी रूप से स्टैक पर अच्छी तरह से रहते हैं। गरबस संग्रह के साथ सी # में वे जल्द ही नष्ट हो जाएंगे, इसलिए ढेर भी ठीक है। लेकिन मैन्युअल new/deleteकॉल के साथ यह इतना आसान और त्रुटि प्रवण नहीं है। महत्वपूर्ण अनुभागों (बड़े डेटा को संभालने) में यह अंतर deleteकर सकता है , विशेष रूप से कॉल काफी धीमा हो सकता है।
wirrbel

1
यह 10000 UI ऑब्जेक्ट्स की समस्या नहीं है, लेकिन एक लाख प्रविष्टियों के साथ जटिल ट्री डेटास्ट्रक्चर के लिए, आदि जहां एक बार चीजों को आवंटित करने के स्मार्ट तरीके का सहारा ले सकता है (बल्क आवंटन या बहुत चालाकी से बूस्ट क्लासेस, आदि)। निष्कर्ष: ढेर बुरा नहीं है, इसका चालाकी से इस्तेमाल किया जाना है। क्यूटी रास्ता कभी-कभी अन्य सामान के लिए पैमाने पर नहीं होता है। यह अभी भी मेरी राय में एक शानदार टूलकिट है।
wirbel

तो C ++ 11 के बारे में कैसे? स्मार्ट पॉइंटर्स आदि आपकी कई चिंताओं को दूर करते प्रतीत होंगे। मैं अभी इसके साथ गड़बड़ करना शुरू कर रहा हूं। जैसा कि मैंने कहा था, मैं सहमत हूँ कि Qt KICKS BUTT। मेरी योजना जीयूआई के लिए क्यूटी का उपयोग करने की है और जो कुछ भी मैं सी ++ 11 का उपयोग कर सकता हूं - जो कि बूस्ट का एक अच्छा सौदा प्रस्तुत करता है, उदाहरण के लिए, अप्रचलित और जावा / सी # और पुराने स्कूल सी ++ के बीच अंतराल को काफी हद तक बंद कर देता है। मुझे यह महसूस होता है कि (इस बिंदु पर दूरी से स्वीकार किया जाता है) कि क्यूटी और सी ++ 11 का संयोजन एक बड़ा विजेता हो सकता है।
वेक्टर

2
मुझे लगता है कि आपको मेरी बात मिल गई: आपके पास C ++ के साथ बहुत सारे विकल्प हैं, सी ++ के साथ आपको बुद्धिमानी से चुनना होगा। स्मार्ट पॉइंटर्स इत्यादि की समस्याएँ भी हैं। C # के साथ उठो आप dlang.org पर एक नज़र डाल सकते हैं जो बहुत सारी चीजों को बेहतर (GCed) करता है।
सिरबेल

इस बीच मुझे C ++ 11 का समर्थन करने वाले एक उपकरण श्रृंखला को एक साथ रखना है। मैं अभी कोडलाइट का उपयोग करता हूं - बहुत अच्छा आईडीई - लेकिन बॉक्स से बाहर (जीएनयू कंपाइलर) यह 11 का समर्थन नहीं करता है, जैसा कि मुझे अभी पता चला है ... शायद मैं इसमें एक 11 संकलक संकलक प्लग कर सकते हैं। डी या बू आदि के साथ शुरू करने के लिए नहीं जा रहा है - जैसा कि मैंने सवाल में कहा था, मुझे नौकरी के बाजार में जल्द ही फिर से हिट करना पड़ सकता है और मैं बाज़ारवाद के लिए मुख्यधारा की भाषाएं रखना चाहता हूं, न कि 'एक बंद'। पायथन के बहुत सारे काम वहाँ - बहुत बुरा मैं किसी भी अधिक पायथन को खड़ा नहीं कर सकता!
वेक्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.