मुझे एक ऐसी कक्षा की आवश्यकता है जो एक ऑस्ट्रीम को अपने ऑब्जेक्ट के जीवनकाल के दौरान एक अन्य ओस्ट्रीम पर रीडायरेक्ट करे। कुछ tinkering के बाद मैं इसके साथ आया:रीडायरेक्टिंग std :: cout
#include <iostream>
#include <fstream>
class ScopedRedirect
{
public:
ScopedRedirect(std::ostream & inOriginal, std::ostream & inRedirect) :
mOriginal(inOriginal),
mRedirect(inRedirect)
{
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
}
~ScopedRedirect()
{
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
}
private:
ScopedRedirect(const ScopedRedirect&);
ScopedRedirect& operator=(const ScopedRedirect&);
std::ostream & mOriginal;
std::ostream & mRedirect;
};
int main()
{
std::cout << "Before redirect." << std::endl;
std::ofstream filestream("redirected.txt");
{
ScopedRedirect redirect(std::cout, filestream);
std::cout << "During redirect." << std::endl;
}
std::cout << "After redirect." << std::endl;
return 0;
}
ऐसा लगता है कि यह ठीक काम करता है। हालांकि, यह अजीब है कि निम्न पंक्ति दोनों निर्माता और नाशक में दोहराया है:
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
मुझे लगता है कि यह सही है, लेकिन मैं इतना समुदाय के साथ सत्यापित करने के लिए करना चाहते हैं। क्या आपको इस कोड में कोई त्रुटि या खतरे मिल सकती हैं?
संपादित करेंगैर-प्रतिलिपि बनाएं।
+1 - यह सही होना चाहिए - लेकिन यह अच्छा होगा यदि आप एक सामान्य के संदर्भ में अपने तर्क लागू किया 'std :: cout' को सीधे कॉल करने के बजाय' std :: ostream'। –
@ बिली ओनेल: क्या स्कोप्ड रेडियोधर्मी पहले से ही एक सामान्य ओस्ट्रीम के संदर्भ में लागू नहीं किया गया है? Std :: cout केवल नमूना में प्रयोग किया जाता है। – StackedCrooked
मैं नहीं कह रहा हूं कि आपकी कक्षा खराब है या गलत है। मैं बस इतना कह रहा हूं कि आउटपुट भेजने के लिए बेहतर होगा जहां आप वास्तव में रीडायरेक्ट करने के लिए कहां जाना चाहते हैं, यह तथ्य के बाद कहां जा रहा है। यही है, मैं कोड कह रहा हूं जो कि किसी भी विशेष स्थान पर इंगित std :: cout पर निर्भर करता है, जहां कोउट पॉइंट्स बदलने के बजाए refactored किया जाना चाहिए। –