객체 수명 기간 동안 하나의 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 커뮤니티에 확인하고 싶습니다 : 그러나, 다음 줄 모두 생성자와 소멸자에서 반복되는 이상한입니다. 이 코드에서 오류나 위험을 발견 할 수 있습니까?
편집복사 할 수 없도록 설정하십시오.
한 - 그것은 정확해야 -하지만 일반적인 측면에서 로직을 구현하는 경우 더 나은 것 'std :: cout'을 직접 호출하는 것이 아니라'std :: ostream'을 사용하십시오. –
@Billy ONeal : ScopedRedirect가 일반적인 ostream으로 구현되지 않았습니까? std :: cout은 샘플에서만 사용됩니다. – StackedCrooked
나는 수업이 잘못되었거나 잘못되었다고 말하는 것이 아닙니다. 나는 사실을 뒤쫓고있는 곳으로 리디렉션하는 것보다 실제로 원하는 곳으로 출력물을 보내는 것이 더 낫다고 말하고 있습니다. 즉, 어떤 특정 위치를 가리키는 std :: cout에 의존하는 코드가 cout 포인트를 변경하는 대신 리팩터링되어야한다고 말하고 있습니다. –