2010-11-23 15 views
8

में ऑब्जेक्ट्स बस एक प्रश्न। सी ++ बूस्ट लाइब्रेरीज़ (विशेष रूप से बढ़ावा :: थ्रेड क्लास में) देखकर मैं सोच रहा हूं: "क्लास परिभाषित ऑब्जेक्ट्स बनाना कितना संभव है जिसे कॉपी नहीं किया जा सकता है लेकिन इसे किसी फ़ंक्शन से वापस किया जा सकता है?"कॉपी करने योग्य नहीं है, लेकिन चलने योग्य, C++

खैर इस उदाहरण पर विचार करें, बढ़ावा :: धागा वर्ग विशेषताओं मैंने पहले उल्लेख किया है, तो यह ऐसा करने के लिए संभव है:

boost::thread make_thread(); 

void f() 
{ 
    boost::thread some_thread=make_thread(); 
    some_thread.join(); 
} 

खैर इसका मतलब है कि वस्तु बढ़ावा :: धागा कॉपी नहीं किया जा सकता है , लेकिन एक समारोह से लौटा, यह संभव है। यह कैसे संभव है ????

मुझे लगता है कि एक प्रतिलिपि निर्माता प्रदान नहीं किया जाना चाहिए, लेकिन किसी फ़ंक्शन से लौटने से कैसे निपटना है? क्या इसे एक कॉपी कन्स्ट्रक्टर का उपयोग करने की आवश्यकता नहीं है ???

ठनक

उत्तर

4

यह सी ++ 1x, जो rvalue संदर्भ के माध्यम से अर्थ विज्ञान के लिए कदम प्रदान करता है में संभव नहीं होगा। इस कर सकते हैं का उपयोग करके आप आगे बढ़ लागू करने और/या प्रतिलिपि separatedly:

class my_class { 
    private: 
    data_t* data_; 
    public: 
    my_class(const my_class& rhs)  // copy constructor 
    : data_(rhs.data_.clone()) 
    {} 
    my_class(my_class&& rhs)   // move constructor 
    : data_(rhs.data_) 
    { 
     rhs.data_ = NULL; 
    } 
    ~my_class() {delete data_;}  // noop if data_==NULL 

    my_class& operator=(my_class rhs) // copy assignment 
    { 
     this->swap(rhs); 
    } 
    my_class& operator=(my_class&& rhs)// move assignment 
    { 
     this->swap(rhs); 
    } 

    // ... 
}; 

कॉपी करने और चलती अलग से मना किया जा सकता है, तो आप सेटअप क्लासेस ले जाया जा सकता है, लेकिन कॉपी नहीं कर सकते हैं।

बेशक

, कुछ जादुई चाल आप ऐसा करते हैं, भले ही आपका संकलक अभी तक कदम अर्थ विज्ञान (std::auto_ptr, जब करने के लिए सौंपा नकल के बजाय सभी चालों के बाद) का समर्थन नहीं करता की अनुमति देते हैं, तो यह boost::thread के लिए भी काम कर सकते हैं चाल semantics की अनुपस्थिति में।

+0

सी ++ 1 एक्स क्या है? मैं इंटरनेट पर सी 1 एक्स और सी ++ 0 एक्स देख सकता हूं, लेकिन सी ++ 1 एक्स नहीं। क्या यह दोनों के लिए शॉर्टेंड है? –

+1

@Alex - यह स्मार्ट-गधे इस तथ्य के लिए बोलता है कि यह पहले से ही 2010 है और उन्होंने रिलीज़ नहीं किया है। एक स्मार्ट-गधा काउंटर है: 0x हेक्साइडसिमल है। –

+0

@Alex: इसे C++ 0x नाम दिया जाता था, क्योंकि इसकी उम्मीद _before_ 2010 थी, लेकिन यह काम नहीं कर सका। कई अभी भी "सी ++ 0x" तक चिपके रहते हैं, भले ही यह संभवतः सी ++ 11 या सी ++ 12 के रूप में समाप्त हो जाएगा। – sbi

2

यदि आप सी ++ 03 में ऐसा करना चाहते हैं तो यह सी ++ का एक उन्नत विषय है। इसके उदाहरण के लिए Howard Hinnants Unique_ptr C++03 emulation देखें।

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

आप सी ++ 03 द्वारा नियोजित ऑटो_प्टर तकनीक का भी उपयोग कर सकते हैं, जिसे कई समूहों द्वारा तोड़ने के रूप में देखा जाता है क्योंकि auto_ptr आपको चर की प्रतिलिपि बनाने देता है, लेकिन कॉपी किए गए ऑब्जेक्ट से संसाधन चुराता है (अन्य समूहों में अन्य राय हैं इसके बारे में)।

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