2012-07-02 16 views
7

यह एक बेवकूफ सवाल हो सकता है, लेकिन मैं निम्न पंक्ति के साथ एक कोड है:अजीब सी ++ वाक्यविन्यास?

Solver *S, *STP = S = 
UseDummySolver ? createDummySolver() : new STPSolver(true); 

मैं त्रिगुट ऑपरेटर जानते हैं, लेकिन यह संकेत है कि मुझे थोड़ा भ्रमित बराबर होती है। क्या कोई मुझे कुछ स्पष्टीकरण दे सकता है? धन्यवाद।

+18

यह एक * बहुत बदसूरत * एक बार में दो चर निर्दिष्ट करने का माध्यम है। * (जला कोड [आरएस] आग के साथ इस तरह) * – user7116

+3

ऐसे कई कारण हैं जिनके लिए यह कोड स्पष्ट रूप से बेकार है। डबल असाइनमेंट हिस्सा उनमें से सिर्फ एक है। आरएआईआई का उपयोग नहीं करना एक और है। –

+0

हां ... मुझे यह भी एहसास नहीं हुआ कि यह कानूनी है, और मैंने इसे पहले कभी नहीं देखा है! – steveha

उत्तर

16

बाहर लिखा है, यह

Solver *S; 
Solver *STP; 
S = UseDummySolver ? createDummySolver() : new STPSolver(true); 
STP = S; 

है हालांकि यह बहुत बदसूरत है, मैं अपने कोड में कर रही है कि सिफारिश नहीं चाहते हैं।

सिफारिश की जिस तरह से यह लिखने के रूप में इस प्रकार है (उपयोग प्रारंभ, बल्कि काम की तुलना में) होगा:

Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true); 
Solver *STP = S; 
+1

+1 बस मुझे हराया :) – NominSim

+2

असाइनमेंट के बजाय प्रारंभिकरण का उपयोग क्यों नहीं करें? – Nawaz

+0

@ नवाज वह सिर्फ ओपी को समझा रहा है कि कोड वास्तव में _does_ क्या है। – NominSim

2

त्रिगुट ऑपरेटर एक मान देता है; UseDummySolver बूलियन मान के आधार पर, यह या तो एक डमी सॉल्वर देता है या यह STPSolver() का एक नया उदाहरण देता है। यह लौटाया गया मूल्य STP और S में संग्रहीत किया जाता है।

5

आप जंजीर असाइनमेंट देख रहे हैं।

Solver *S; 
Solver *STP; 
S = UseDummySolver ? createDummySolver() : new STPSolver(true); 
STP = S; 
+0

@sixlettervariables हाँ निश्चित माफ करना, सी ++ मेरा फोर्टे नहीं। – NominSim

+0

समय सब कुछ है :) +1 भी – houbysoft

+1

@sixlettervariables, NominSim, मैंने जवाब संपादित किया और गलत अस्वीकृति में डाल दिया। उसके लिए माफ़ करना; मूल कोड मुझे भ्रमित कर दिया। नोमिनसिम की गलती बिल्कुल नहीं। – steveha

6

मैं इस सिफारिश करेंगे:

यह वही है

Solver *S = UseDummySolver ? createDummySolver() : new STPSolver(true); 
Solver *STP = S; 

यह, संक्षिप्त अभी तक साफ और स्वच्छ है।

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

+1

प्रारंभिक बनाम असाइनमेंट के लिए आपको सिफारिश के लिए +1 दिया गया :) – houbysoft

0

मैं पसंद करेंगे या तो इस:

std::unique_ptr<Solver> S ( UseDummySolver 
            ? createDummySolver() 
            : new STPSolver(true) ); 
Solver& STP = *S; 

या इस:

std::shared_ptr<Solver> S ( UseDummySolver 
            ? createDummySolver() 
            : new STPSolver(true) ); 
std::shared_ptr<Solver> STP = S; 

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

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