2012-09-23 45 views
7

मैं कुछ कोड सी ++ 11-आईएन हूं। मेरे पास हैअन्यथा स्वामित्व और कच्चे सूचक के लिए unique_ptr का उपयोग करें?

class X { /* */ }; 

class A { 
    std::vector<X*> va_x; 
}; 

class B { 
    std::vector<X*> vb_x; 
    std::vector<A> vb_a; 
}; 

वस्तुओं के लिए मेरी कक्षा एक बिंदु अंदर "va_x" के एक्स * रों वह भी मेरी कक्षा बी के अंदर "vb_x" के एक्स * द्वारा की ओर इशारा कर रहे हैं

अब मैं करूंगा स्मार्ट पॉइंटर्स का उपयोग करना पसंद है। मेरे लिए, यह स्पष्ट लगता है कि वर्ग बी वस्तुओं एक्स * द्वारा बताया का स्वामित्व है (विशेष रूप से, क्योंकि मेरी एक उदाहरणों बी के हैं)

तो मैं बी अंदर एक्स के लिए एक unique_ptr उपयोग करना चाहिए:

class B { 
    std::vector<unique_ptr<X>> vb_x; 
    std::vector<A> vb_a; 
}; 

मेरा सवाल है, कक्षा ए के लिए मुझे क्या करना चाहिए? क्या मुझे कच्चे पॉइंटर्स रखना चाहिए? मेरी इकाई परीक्षण में ऐसा करते समय, से, मैं स्वीकार करना होगा कि यह अजीब बातें (IMO) की ओर जाता है, उदाहरण के लिए (कैप्सूलीकरण के बारे में चिंता मत करो, उस बिंदु नहीं है):

unique_ptr<X> x(new X()); 
A a; 
a.va_x.push_back(&(*x)); //awkward, but what else can I do? 

A.vb_a.push_back(a); //ok 
B.vb_x.push_back(move(x)); //ok 
+0

सी ++ 11 के बारे में भविष्य के प्रश्नों के लिए, कृपया उन्हें सी ++ के साथ टैग करें। :) – Xeo

+1

क्या आपने पहले एक समान रूप से समान प्रश्न नहीं पूछा था? – Puppy

+0

@DeadMG वैसे पिछला एक अद्वितीय_ptr के बारे में भी है, लेकिन यह वही बात नहीं है जो मुझे लगता है कि –

उत्तर

9

आप x.get() उपयोग कर सकते हैं, जो आंतरिक सूचक वापस करेगा।

इसके अलावा, गैर-मालिक संदर्भों को संभालने के लिए कच्चे पॉइंटर्स का उपयोग करने का तरीका है, this question भी देखें।

+0

ठीक है धन्यवाद। लेकिन यह इतना बेहतर नहीं है? तो मुझे कच्चे पॉइंटर्स का उपयोग करना चाहिए? –

+0

@ बेरेंगेरथथौल: कच्चे पॉइंटर्स का उपयोग करने के साथ * कुछ भी * गलत नहीं है जब तक कि उनके पास कुछ भी नहीं है। जैसा कि नाम कहता है, उन्हें सिर्फ चीजों को इंगित करना चाहिए और सबकुछ ठीक है। – Xeo

+0

मान लीजिए कि इसे हल किया जाए। मैं इन नई सुविधाओं के बारे में बहुत सतर्क हूं क्योंकि मुझे उनके साथ कोई वास्तविक कोड नहीं मिला। और जैसा कि मैंने सुना है "हर जगह अपने कच्चे पॉइंटर्स को स्मार्ट लोगों के साथ प्रतिस्थापित करें", मुझे लगता है कि कच्चे पॉइंटर्स की अब आवश्यकता नहीं है (जो बहुत स्मार्ट नहीं है ...) धन्यवाद –

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

  • कोई संबंधित समस्या नहीं^_^