2011-08-02 12 views
9

मैं एक अमूर्त वर्ग std :: ostream का उपयोग कर रहा हूँ।std :: ostream के संदर्भ को असाइन करने का संकलन क्यों विफल हो जाता है?

std::ostream &o = std::cout; 

किसी भी शर्त पूरी होती है मैं ओ ताकि उत्पादन एसटीडी :: अदालत पुनः निर्देशित किया जाएगा प्रारंभ करने की आवश्यकता: वहाँ निम्नलिखित संदर्भ है। यदि नहीं, तो आउटपुट को

if (!condition) 
    o = file; //Not possible 

कोड को सही तरीके से लिखने के लिए रीडायरेक्ट किया जाएगा?

+0

यह समस्या std :: ostream की तुलना में संदर्भों को संशोधित करने के बारे में अधिक है, मैं शीर्षक बदलने का सुझाव दूंगा। क्योंकि सवाल एक अच्छा है। – daramarak

+0

आपको सी ++ में संदर्भ को समझने की आवश्यकता है बस एक उपनाम का मतलब है। तो एक बार जब संदर्भ शुरू किया गया है, तो कोई और ऑपरेटर = इसका मतलब है कि संदर्भ मूल संदर्भ को संदर्भित कर रहा है। स्टीव के उत्तर में नीचे एक अच्छा उदाहरण पाया जा सकता है। स्टीव के अच्छे और आगे स्पष्टीकरण के लिए – Gob00st

उत्तर

5

आप एक संदर्भ को संशोधित नहीं कर सकते हैं।

यह एक विकल्प यह है:

std::ostream &o = (!condition) ? file : std::cout; 
16

कोई एक:

std::ostream &o = condition ? std::cout : file; 

या आपकी दो स्निपेट के बीच में कोड अगर:

std::ostream *op = &std::cout; 
// more code here 
if (!condition) { 
    op = &file; 
} 
std::ostream &o = *op; 

समस्या के लिए विशेष रूप से नहीं है अमूर्त वर्ग के साथ करें, यह है कि संदर्भों का शोध नहीं किया जा सकता है।

अभिव्यक्ति o = file का अर्थ नहीं "ofile का उल्लेख करना" है, यह "o की referand में file के मान की प्रतिलिपि" है। सौभाग्य से आपके लिए, std::ostream में operator= नहीं है, और इसलिए यह संकलित करने में विफल रहता है और std::cout संशोधित नहीं है। लेकिन विचार करें कि एक अलग प्रकार के साथ क्या होता है:

#include <iostream> 

int global_i = 0; 

int main() { 
    int &o = global_i; 
    int file = 1; 
    o = file; 
    std::cout << global_i << "\n"; // prints 1, global_i has changed 
    file = 2; 
    std::cout << o << "\n"; // prints 1, o still refers to global_i, not file 
} 
+0

+1! – Gob00st

+0

@Steve: समस्या न केवल संदर्भों को रीसेट नहीं किया जा सकता है, ओपी के मामले में 'o = file' संकलित नहीं होगा, [क्योंकि 'std :: ostream' या C++ में किसी भी स्ट्रीम को असाइन नहीं किया जा सकता (या कॉपी किया गया)।] (http://stackoverflow.com/questions/6010864/why-copying-stringstream-is-not-allowed/6010930#6010930) – Nawaz

+0

@ नवाज: मैंने इसका जिक्र किया है, लेकिन आईएमओ यह कोई समस्या नहीं है। मुझे नहीं लगता कि प्रश्नकर्ता वास्तव में एक फाइल में 'stdout' को रीडायरेक्ट करना चाहता है, जो एकमात्र प्रभाव है जिसे मैं सोच सकता हूं कि' ऑपरेटर = 'यदि यह अस्तित्व में था तो होगा। –

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