कोई एक:
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
का अर्थ नहीं "o
file
का उल्लेख करना" है, यह "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
}
स्रोत
2011-08-02 09:27:49
यह समस्या std :: ostream की तुलना में संदर्भों को संशोधित करने के बारे में अधिक है, मैं शीर्षक बदलने का सुझाव दूंगा। क्योंकि सवाल एक अच्छा है। – daramarak
आपको सी ++ में संदर्भ को समझने की आवश्यकता है बस एक उपनाम का मतलब है। तो एक बार जब संदर्भ शुरू किया गया है, तो कोई और ऑपरेटर = इसका मतलब है कि संदर्भ मूल संदर्भ को संदर्भित कर रहा है। स्टीव के उत्तर में नीचे एक अच्छा उदाहरण पाया जा सकता है। स्टीव के अच्छे और आगे स्पष्टीकरण के लिए – Gob00st