2016-09-02 10 views
-2

이전에는 fstream 객체의 주소를 I/O 연산을 수행하는 생성자를 포함한 모든 함수에 전달했습니다. 하지만 fstream 객체를 멤버 변수로 사용할 수있게하여 모든 후속 I/O 작업에서 인수로 전달하는 대신 해당 변수를 사용할 수있게하려고합니다.어떻게 fstream 객체를 멤버 변수로 사용할 수 있습니까?

public class A { 
    Scanner sc; 

    public A(Scanner read) { 
     sc = read; 
    } 
} 

는 어떤이의 C++ 동등한 것 :

는 다음과 같은 자바 프로그램을 고려

? 나는이

class A { 
    ofstream *out; 

    public: 
     A (ofstream &output) { 
      out = output; 
     } 
}; 

일을 시도하지만이 나에게 컴파일 오류가 있습니다 : 당신은 아마 파일에 대한 전문 std::ofstream 때문에

class A { 
    ofstream *out; 

    public: 
     A (ofstream &output) : out(&output) { 
           //^Take the address 
     } 
}; 

을 원하는

[Error] invalid user-defined conversion from 'std::ofstream {aka std::basic_ofstream}' to 'std::ofstream* {aka std::basic_ofstream*}' [-fpermissive]

+5

포인터에 대한 참조를 할당 할 수 없습니다. 그것들은 다른 것들입니다. – tkausl

+2

_ "하지만이 때문에 컴파일 오류가 발생합니다."_ 컴파일 오류에 대해 구체적으로 설명하십시오. [MCVE]를 게시하십시오! –

+2

또한 출력을 요구하고 있습니다. _scanner_와 같은 입력은 아닙니다. –

답변

5

처럼뿐만 아니라 비 파일 중심의 출력 대상을 투명하게 클래스를 사용할 수 있습니다.

class A { 
    ofstream& out; 

    public: 
     A (ofstream &output) : out(output) {} 
}; 

포인터를 사용하는 것보다 깔끔합니다.

A 유형의 객체가 Scanner이 제안하는 것처럼 스트림에서 데이터를 읽으려는 경우 std::istream을 사용하십시오.

class A { 
    std::istream& in; 

    public: 
     A (std::istream &input) : in(input) {} 
}; 
+0

방금 ​​OP가 완전히 틀린 나무를 짖는 것을 보았습니다. 그들은 출력이 아닌 입력을 원합니다. –

+0

@ πάνταῥεῖ, 좋은 전화. 다행히도, 같은 원칙이 'istream'에도 적용됩니다. –

+0

네, 그렇습니다.) ... –

4

을의 더 나은 인터페이스 다음과 같습니다 :

class A { 
    ostream *out; 

    public: 
     A (ostream &output) : out(&output) { 
     } 
}; 

따라서 당신은 내가 클래스의 멤버 변수로 참조 형식의 사용을 제안

A a(std::cout); // writes to standard output rather than using a file