cout

2017-02-09 20 views
6

को समझने में अद्वितीय_ptr प्रिंटिंग यह समझ में नहीं आता कि यह क्यों विफल रहा है?cout

int *p = new int(10); 
std::unique_ptr<int> ptr(p); 
// Below line gives compilation error. 
std::cout << "Value of ptr  " << ptr << std::endl; 
// Below line works well. 
std::cout << "Value pointed ptr " << *ptr << std::endl; 
std::cout << "Value of ptr->get() " << ptr.get() << std::endl; 

मैं इसे इस तरह से समझते हैं:

कहो पी पता 100, नई आबंटित स्मृति के पते 200.

p    new allocated memory 
----------  --------- 
    200    10 
----------  --------- 
100    200 


ptr 
---------- 
    200 
---------- 
300 

ऊपर चित्रण में है, unique_ptr नव आबंटित स्मृति की ओर इशारा करते है खुद, 'पी' से परहेज। तो, मुझे 'पीटीआर' प्रिंट नहीं करना चाहिए 200 मुझे?

उत्तर

2

तो, मुझे 'पीटीआर' प्रिंटिंग नहीं करना चाहिए 200 मुझे?

यह, अगर मानक पुस्तकालय निर्दिष्ट std::unique_ptr मानक धाराओं में स्ट्रीम करने योग्य होना चाहिए चाहिए। दूसरे शब्दों में, operator <<std::unique_ptr के लिए एक अधिभार मौजूद होना चाहिए।

हालांकि, मानक ऐसी कोई चीज़ निर्दिष्ट नहीं करता है, और इसलिए एक संकलन त्रुटि में unique_ptr परिणाम स्ट्रीमिंग (operator << इसे स्वीकार करता है)। समाधान है के रूप में आप पाया है:

stream << ptr.get() 
+0

ओहो। सही बात। अधिभारित करने के लिए C++ समुदाय को रोक रहा था <

+1

@ हेमंत भार्गव: वास्तव में जरूरी नहीं है। सी ++ मानक पहले से ही बहुत बड़ा है (*), सामान जोड़ने से लगभग कोई भी इसका उपयोग नहीं करेगा। *: नहीं, मेरे पास क्या निकालना है इसके लिए कोई अच्छा सुझाव नहीं है। –

+2

@ मार्टिनबोनर सुझावों को पतला करने के लिए, 'std :: vector ' दिमाग में आता है। – Angew

9
std::unique_ptr<int> ptr(p); 
// Below line gives compilation error. 
std::cout << "Value of ptr  " << ptr << std::endl; 

यह कुछ का एक उद्देश्य मुद्रित करने के लिए हमेशा की तरह << सिंटैक्स का उपयोग करने के लिए संभव बनाने के लिए: यदि आप सूचक स्ट्रीम करने के लिए की जरूरत है, सूचक मिलता है cout का उपयोग कर कक्षा, लागू operator<< का उचित अधिभार होना चाहिए।

उदाहरण के लिए, यदि आप एक दसवीं कक्षा है, अगर आप cout << x वाक्य रचना सक्षम करना चाहते हैं, तो आप operator<< इस तरह ओवरलोड कर सकते हैं:

#include <ostream> // for std::ostream 

std::ostream& operator<<(std::ostream& os, const X& x) 
{ 
    // Implement your output logic for 'x' 
    ... 

    return os; 
} 

सी ++ मानक पुस्तकालय डिजाइनरों चुना है के लिए इस तरह के एक अधिभार लागू करने के लिए नहीं std::unique_ptr; यही कारण है कि जब आप एस के उदाहरणों के साथ << का उपयोग करने का प्रयास करते हैं तो संकलन त्रुटि प्राप्त होती है।

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