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