20
我需要一个类,在其对象的生命周期中将一个ostream重定向到另一个ostream。经过一番修补后,我想出了这个:重定向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()));
我认为这是正确的,但我想验证与SO社区。你能在这段代码中发现任何错误或危险吗?
编辑使不可复制。
+1 - 这应该是正确的 - 但它会更好,如果你在一个通用的术语来实现你的逻辑`std :: ostream`而不是直接调用`std :: cout`。 – 2011-01-20 22:06:34
@Billy ONeal:ScopedRedirect是不是已经用通用的ostream实现了? std :: cout仅用于示例中。 – StackedCrooked 2011-01-20 22:11:03