2012-03-29 3 views
1

최근에 C++로 코딩을 시작했으나 C로 작성하는 데 오랜 시간이 걸렸습니다. 따라서 fstream 클래스의 메서드를 읽고 있는데 프로 시저가 될 수있는 모든 메서드가 반환되고 있음을 알았습니다 메서드를 호출 한 객체에 대한 참조입니다. (예 : fstream & fstream :: read (char_type * __s, streamsize __n)).fstream 메서드가 "* this"에 대한 참조를 반환하는 이유는 무엇입니까?

왜 이렇게 했습니까? 내가 너무 내 읽기 방법에 대한 참조를 반환해야 만약 내가 궁금하네요 그래서

나는 fstream 클래스의 상단에 약간의 레이어를 코딩하고 있습니다.

감사합니다.

+2

http://en.wikipedia.org/wiki/Method_chaining – Corbin

+0

이 허용 않는 한 가지는 호출의 체인입니다 오버로드 된 리디렉션 연산자를 포함합니다. 나는 사용자에게 몇 가지 flexibile 옵션을 사용하기 때문에 권장 사항을 따르는 것이 좋습니다. –

답변

6

자체가 당신을 제공하는 스트림 개체에 대한 참조를 반환 I/O 작업의 유효성을 확인하는 훌륭한 방법입니다. 작업이 실패하면 스트림 개체가 실패 상태에 있으며 이는 부울 컨텍스트에서 false으로 평가됨을 의미합니다. 따라서 우리가 쓸 수 있습니다 : 두 번째 예에서는 특히 반복 호출

while (std::getline(instream, str)) { /* ... process line ... */ } 

if (anotherstream >> x >> y) { /* process x and y */ } 
else { /* error, at least one extraction failed */ } 

if (!laststream.read(buf, sizeof(buf)) { /* error */ } 

참고 : 각 추출 스트림 객체에 대한 참조를 반환하고, 그래서 우리는 하나의 명령문에서 여러 추출을 연결할 수 있으며, 어떤의 경우 실패하면 전체 작업이 false으로 평가됩니다. 여기

은 표준 입력에서 양식 [x y z]의 라인을 구문 분석, 실제 예제 :

for (std::string line; std::getline(std::cin, line);) 
{ 
    std::istringstream iss(line); 
    char l, r; 
    double x, y, z; 

    if (!(iss >> l >> x >> y >> z >> r) || (l != '[') || (r != ']')) 
    { 
     std::cerr << "Malformed line ('" << line << "'), skipping.\n"; 
     continue; 
    } 

    std::cout << "You said: " << x << ", " << y << ", " << z << std::endl; 
} 
4

method chaining 사용할 수 있습니다.

stream << "foo"; 
stream << "bar"; 

그것은 기본적 이유

stream << "foo" << "var"; 
+0

왜 downvote? –

5

http://en.wikipedia.org/wiki/Method_chaining

https://isocpp.org/wiki/faq/references#method-chaining

로 대체 할 수 있습니다

cout << "Hello " << "World"; 

작품.

(Luchian 고르가 지적했듯이 비록, cout을이 같은 아이디어는하지만 적용됩니다. fstream하지 않고, 그의 대답은 fstream의 예를 제공합니다.)

+0

'cout'은'fstream'이 아닙니다. –

+0

@LuchianGrigore 아, 아주 좋은 지적입니다. 나는 일반적으로 시내를 생각하고 있었다. 같은 아이디어가 여전히 사슬에 붙어 있지만 적용됩니다. 그냥 직접하지 마라. – Corbin

+0

동의, 그래서 내가 downvote하지 않았다. :) –

관련 문제