2016-09-02 112 views
-2

以前は、fstreamオブジェクトのアドレスをI/O操作を行うコンストラクタを含む関数に渡しました。しかし、fstreamオブジェクトをメンバー変数として使用できるようにして、後続のすべての入出力操作でそれらの変数を引数として渡す代わりに使用できるようにしたいと考えています。fstreamオブジェクトをメンバ変数として使用するにはどうすればよいですか?

は、次のJavaプログラムを考えてみましょう:

public class A { 
    Scanner sc; 

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

本のC++と同等でしょうか?私はこの

class A { 
    ofstream *out; 

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

をやってみました。しかし、これは私のコンパイルエラーを与える:

[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

おそらくstd::ofstreamので

class A { 
    ofstream *out; 

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

をしたいが、より良いインタフェース、ファイルに特化しています

class A { 
    ostream *out; 

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

したがって、あなたは

A a(std::cout); // writes to standard output rather than using a file 
関連する問題