2010-11-10 15 views
13

मैं अपने समग्र डिजाइन में थोड़ा और अधिक दोबारा विचार करना होगा, लेकिन के रूप में यह खड़ा है, ऐसा लगता है कि मैं कुछ ऐसा करना चाहते हैं हो सकता है:क्या आप मानचित्र के लिए कुंजी के रूप में boost :: shared_ptr का उपयोग कर सकते हैं?

class A; 
class B; 
std::map<boost::shared_ptr<const A>, B> APtrToBMap; 

मैं इस की कोशिश की है, और यह में काम प्रतीत होता है एक साधारण मामला (संकलक शिकायत नहीं करता था, और सरल परीक्षण काम करने लगते हैं)। लेकिन मुझे इस दृष्टिकोण के बारे में दूसरे विचार हैं। मुझे संदेह है कि वहां कुछ गठिया हैं जिन्हें मैं नहीं जानता हूं।

तो, इसके बाद के संस्करण के लिए एक व्यावहारिक अर्थ में मान्य है? या क्या कोई दोष है, मुझे पता नहीं है कि मैं ऐसा कब करता हूं?

+1

से उन shared_ptr वस्तुओं में पास क्या काम नहीं करता है विफल हो सकता है? –

+1

@ सैम, सिर्फ इसलिए कि आपको कोई समस्या नहीं मिली है, इसका मतलब यह नहीं है कि यह कोई भी नहीं है। मुझे लगता है कि इस तरह के गैर मानक उपयोग के लिए संभावित समस्याओं के बारे में पूछना एक अच्छा विचार है। –

+0

आपकी प्रतिक्रियाओं के लिए सभी को धन्यवाद। जैसा कि आप में से कुछ ने ध्यान दिया, यह मुख्य रूप से खराब डिजाइन का एक लक्षण है; मैं गलत जगह में एक समस्या को हल करने की कोशिश कर रहा था। मैंने तब से अपने डिजाइन को दोबारा तैयार किया है और मुझे उस खराब मानचित्र को करने की आवश्यकता नहीं होगी जिसके बारे में मैंने सवाल किया था। जवाब यह क्यों एक बुरा विचार है कि वास्तव में प्रबुद्ध थे; मैं अपने आंत में जानता था कि यह काफी नहीं करेगा जो मैं करना चाहता था; मैं अभी तक क्यों नहीं देख सका। (वास्तव में जो मैं करने की कोशिश कर रहा था वह ऊपर से टेम्पर्ड किए गए मानचित्र के साथ काम नहीं करेगा) – Taeolas

उत्तर

24

संदर्भ यह कहना है:

template<class T, class U> 
    bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws 

रिटर्न: एक अनिर्दिष्ट मूल्य ऐसी है कि

  • ऑपरेटर < एक सख्त कमजोर आदेश खंड 25.3 में वर्णित है [lib.alg.sorting] सी ++ मानक के;
  • तुल्यता संबंध ऑपरेटर <,! (एक < ख) & & द्वारा परिभाषित के तहत! (ख < एक), दो shared_ptr उदाहरणों यदि और केवल यदि वे स्वामित्व साझा या दोनों खाली हैं बराबर हैं।

फेंकता: कुछ भी नहीं है।

नोट्स: की अनुमति देता है shared_ptr वस्तुओं साहचर्य कंटेनरों में कुंजी के रूप में प्रयोग की जाने वाली।

+0

मुझे खुशी है कि आपको यह मिला। मैं शीर्ष पर एक त्वरित झलक के आधार पर विपरीत निष्कर्ष पर आया, लेकिन यह मेरे स्वयं के दोषपूर्ण विश्लेषण पर आधारित था। –

+0

एमएम। दो अलग पॉइंटर्स की तुलना करने का समर्थन क्यों करें? – wilhelmtell

+1

लेकिन क्यों कोई एक कंटेनर में एक कुंजी के रूप में shared_ptr का उपयोग करना चाहता है? – davka

0

मैं साझा पॉइंटर से 100% परिचित नहीं हूं, लेकिन यदि मूल सूचक तक पहुंच प्राप्त करने का कोई तरीका है, तो आप इसे कुंजी के रूप में उपयोग कर सकते हैं (यदि आप अभी भी किसी कारण से चिंतित हैं)।

+0

लेकिन फिर नक्शा share_ptr को खुद को नष्ट करने से नहीं रखेगा। यदि आप share_ptr को मानचित्र में स्वयं रखना चाहते थे, तो आप इसे ऐसा बना सकते हैं कि पीआरटी का एकमात्र संदर्भ नक्शे के भीतर पाया गया था। –

+0

मुझे समझ में नहीं आ रहा है ... वह सिर्फ बी ऑब्जेक्ट के पॉइंटर का नक्शा चाहता है, इसलिए मैंने कहा कि अगर वह किसी कारण से साझा पीआरटी का उपयोग करने से डरता है तो वह पॉइंटर का उपयोग कर सकता है। – robev

+0

या क्या आपका मतलब है कि मानचित्र में shared_ptr की एक प्रति होने के कारण, यह ऑब्जेक्ट को हटाए जाने से रोक देगा? – robev

4

हाँ, आप std :: नक्शे के लिए कुंजी के रूप में एक साझा सूचक का उपयोग कर सकते हैं, लेकिन वह टूट डिजाइन की एक निश्चित संकेत है। यह कुछ यादृच्छिक स्मृति स्थानों के अनुसार आदेश दिया जाएगा।

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

+2

यादृच्छिक क्रम के साथ एक मानचित्र अभी भी उस डेटा के त्वरित लुकअप के लिए उपयोगी है जो ऑब्जेक्ट का हिस्सा नहीं है। मैं एक टूटी हुई डिजाइन के समापन पर कूद नहीं पाऊंगा। –

+0

@ मार्क क्या आप एक उदाहरण दे सकते हैं? यदि मानचित्र की कुंजी एक सूचक है, तो मानचित्र का मान ऑब्जेक्ट का हिस्सा क्यों नहीं है? प्रभाव वही है। –

+0

क्या होगा यदि आप किसी विशेष वस्तु के आधार पर डेटा खोजना चाहते हैं? मैंने यूआई सूचियों में आइटम्स को डेटा जोड़ने में यह कुछ बार उपयोग किया है और ऐसे में जब एपीआई ऐसा करने का उचित तरीका प्रदान नहीं करता है। –

0

सावधान यदि आप बढ़ावा :: अजगर के साथ संयोजन के रूप में इस का उपयोग कर रहे हैं! C++ सभी आपरेशनों shared_ptr वस्तुओं की तुलना के आधार पर अगर आप अजगर

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

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