2011-05-14 2 views
3

타사에서 제공 한 C++ 클래스를 사용하고 있으므로 수정할 수 없습니다. 수많은 프로퍼티를 가지고 있지만 형식화 된 출력을 생성하는 메소드 또는 연산자 오버로드 (<<)가 없습니다. 단순히 문자열을 반환하는 함수를 작성할 수 있지만 클래스를 수정하지 않고 형식화 된 출력을 만드는 더 나은 C++ 방법이 있습니까?C++ 포매터 클래스?

+4

'연산자 <<''표준 : ostream'에 사용 어쨌든 멤버 함수를 수 없습니다 ... 왜 당신이 당신의 자신을 쓸 수 있다고 생각합니까? –

+0

@James McNellis :이 상황에서는 거의 확실하게 적용되지 않지만 공개 인터페이스를 통해 액세스 할 수없는 수정 불가능한 클래스의 개인 멤버에서 출력을 생성하려는 병적 인 경우를 상상할 수 있습니다. –

답변

6

예. 스트림 삽입 연산자를 비 멤버 함수로 오버로드 할 수 있습니다. 물론 단점은 함수를 친구로 만들 수는 없으므로 (공용 속성을 통해) 클래스에 의해 노출되지 않는 내용을 공용 접근자를 통해 출력 할 수는 없지만 제한적입니다. 당신이 수업을 수정할 수 없다면 무엇을 하든지 상관 없습니다.

예 :

class Foo { 
    public: 
    std::string name() const; 
    int number() const; 
    private: 
    // Don't care about what's in here; can't access it anyway. 
}; 

// You write this part: 

std::ostream& operator<< (std::ostream& os, const Foo& foo) { 
    // Format however you like in here, e.g. 
    os << "(" << foo.name() << "," << foo.number() << ")"; 
    return os; 
} 

// Then you can write: 

Foo foo; 
std::out << foo;