2009-06-22 14 views
5

मैं दो मान वापस करना चाहता हूं, जिनमें से एक एक नई वस्तु है। मैं std::pair का उपयोग कर ऐसा कर सकते हैं:किसी अन्य मान के साथ एक नई वस्तु को लौटाना

class A { 
//... 
}; 

std::pair<A*, int> getA() 
{ 
    A* a = new A; 
    //... 
} 

कोड अपवाद-सुरक्षित बनाने के लिए, मुझे क्या करना चाहते हैं:

std::pair<std::auto_ptr<A>, int> getA() 
{ 
    std::auto_ptr<A> a(new A); 
    //... 
} 

लेकिन इस संकलन नहीं होगा के रूप में auto_ptr को संशोधित किए बिना कॉपी नहीं किया जा सकता है auto_ptr कॉपी किया जा रहा है। ठीक है, इसका मतलब है auto_ptr अन्य प्रकारों (एक और तरीके से) की तरह अच्छी तरह से लिखता नहीं है। इस मामले में एक नई वस्तु वापस करने का एक अच्छा तरीका क्या है?

एक विकल्प shared_ptr वापस करने के लिए है और दूसरा एक इनआउट संदर्भ है। लेकिन मैं कुछ अन्य विकल्प की तलाश में हूं। मैं कुछ ऐसा कर सकता हूं:

class AGetter 
{ 
    void getAExecute() 
    { 
     //... 
     // set a_ and i_ 
    } 
    std::auto_ptr<A> getA() const 
    { 
     return a_.release(); 
    } 
    int getInt() const 
    { 
     return i_; 
    } 
    private: 
    std::auto_ptr<A> a_; 
    int i_; 
}; 

क्या कोई बेहतर तरीका है?

उत्तर

2

बस एक नया वर्ग उस वर्ग

class Result 
{ 
    A* a; 
    int i; 
public: 
    Result(A*a, int i) : a(a), i(i) { 
    } 
    ~Result() { 
     delete a; 
    } 
    // access functions, copy constructor, ... 
}; 

Result getA() { 
    //...  
    return Result(new A, intValue); 
} 
1

यह बहुत नहीं है, लेकिन आप एक सूचक या संदर्भ तर्क के माध्यम से अन्य मान सकता है:

int i; 
std::auto_ptr<A> a = getA(&i); 
5

वहाँ दो प्रमुख तरीके से इस समस्या को संभालने के लिए कर रहे हैं:

  1. सफाई स्वयं करें, कोशिश/पकड़ के माध्यम से।
  2. shared_ptr जैसे किसी प्रकार के स्वचालित मेमोरी प्रबंधन का उपयोग करें।

auto_ptr वास्तव में इस तरह के मामलों में काम नहीं करता है, जैसा कि आपने पाया है, लेकिन नए मानक और बूस्ट दोनों संदर्भ-गिनती पॉइंटर्स हैं जो आप चाहते हैं। हमें बताएं कि आपको shared_ptr के बारे में क्या पसंद नहीं है, और शायद हम एक विकल्प सुझा सकते हैं।

+0

shared_ptr बना सकते हैं और वापस जाने से थोड़ा/तुच्छता से अक्षम और वायरल है। Shared_ptr के खिलाफ बहुत मजबूत तर्क नहीं, लेकिन फिर भी उनके खिलाफ एक कारक बनाते हैं (मामलों में से 10%)। –

+1

सौभाग्य से, अगले मानक में unique_ptr है, जिसे इसमें शामिल जोड़ी के साथ स्थानांतरित किया जा सकता है। –

1

दो संदर्भ पैरामीटर के माध्यम से क्यों नहीं?

class AGetter 
{ 
    // .. 
    void get(std::auto_ptr<A>& a, int& i) 
    { 
     a = a_.release(); 
     i = i_; 
    } 
    // .. 
}; 
+0

यही मेरा मतलब है संदर्भ में। इनआउट संदर्भ ठीक हैं, लेकिन आप अभी भी एक समझौता सहमत होंगे (फ़ंक्शन हस्ताक्षर फ़ंक्शन को कॉल करने के प्रभाव को स्पष्ट नहीं करता है)। –

3

एक shared_ptr उस स्थिति में आदर्श होगा, लेकिन आप वस्तु और इसके बजाय पूर्णांक युक्त एक जोड़ी के लिए एक auto_ptr लौट सकते हैं आप वास्तव में उन का उपयोग नहीं करना चाहते हैं।

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