• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:fstream型オブジェクトを関数の仮引数にする)

C++のfstream型オブジェクトを関数の仮引数にする方法は?

このQ&Aのポイント
  • C++のプログラムで、fstream型・ifstream型・ofstream型のオブジェクトを関数の仮引数にする方法を知りたいです。
  • 具体的には、ファイルの内容を1つの文字列変数に格納する関数を作成したいです。
  • 現在、fstream型のオブジェクトを関数に渡そうとしたところ、エラーが発生しました。何か解決策はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

C++でクラスを使ったプログラミング、どれくらいやってますか? > void file_to_str(fstream file, char *str) のように書いたら、値呼び出しなので、fstreamオブジェクトのコピーが作られる、というのは理解してますか? このようなオブジェクトのコピーに呼び出されるのがcopy constructor(コピーコンストラクタ)です で、ファイルの管理がばらばらにならないように、コピーできないようにしてあるのが、エラーの原因です。 Cからの方法であるポインタを使うか void file_to_str(fstream *file, char *str) (定義中の file.XX → file->XX 、 呼び出しはfile_to_str(&file,str) ) C++で追加された参照呼び出しを使うか void file_to_str(fstream &file, char *str) これは、他のオブジェクトでも同様です。fstreamのようにコピーが禁止されているものばかりではありませんが ・コピーに対しての処理でいいのか?処理がいいのか? ・同じオブジェクトに対して処理をしなければならないのか? を考えて作りましょう。 あと > str=""; //初期化しとかないとダメ。 これはfile_to_str関数内でのローカル変数 char *str に 文字列リテラル"" のアドレスを入れているだけです。呼び出し側のstrのアドレスがわからなくなってしまうだけでなく、おそらく定数用の領域に確保された文字列リテラル""のアドレスへ書き込もうとします。 ポインタの使いかた、char*を使った文字列の使いかたをもう一度見直しては?

MetalLover
質問者

お礼

大変御丁寧な御回答、ありがとうございます。 しばらくC++から遠ざかっていたもので、値呼び出しの時に、コピーコンストラクタが呼び出される事などを忘れていました。 御提案頂いた通り、C++の参照呼び出しを使うと上手く行きました。 「str=""; //初期化しとかないとダメ。」 という1行は、初歩的なミスですね。(笑) これを消さないと上手く行きませんでした。 適切すぎる御説明、御見事でした。

関連するQ&A