2016-04-19 12 views
-1

私が持っているのは、関数を使って2つのファイルを連結する作業です。だから私がしようとしていたのは次のようなものです:なぜC++の関数に参照でファイルを渡すべきですか?

#include <iostream> 
#include <fstream> 
#include <cstring> 

using namespace std; 

void concatenateFiles(ifstream fileA, ifstream fileB, ofstream fileAB){ 
    ... 
} 

しかし私は理解できなかったエラーを抱えていました。だから私はこれを次のように変更しました:

それはうまくいきましたが、私はそれがなぜなのか完全にはわかりません。私はそれが参照によって渡されない限り、ファイルにアクセスできないことと関係があると思います。おそらくC++は、参照渡しでないと他の変数のコピーを作るようなファイルのコピーを作ることはできないでしょうか?これは私がこれで得ることができる限りです。これは私の最初のプログラミングコースなので、できるだけシンプルに答えることができれば素晴らしいだろう!

ありがとう、ラミ。

+1

はい、['std :: ifstream'](http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream)はコピーコンストラクタを提供しません。 –

+0

ストリームをコピーするとはどういう意味ですか? –

+0

@DavidSchwartz私はまだストリームのコンセプトを完全には理解していないので、まだそのレベルで判断することはできません:/ –

答えて

2

std::ifstream(およびその他のストリームクラス)は、コピーコンストラクタを実装していません(正しくはそうです)。 C++ 11以降では、コンパイラのデフォルトコピーコンストラクタは= deleteによって明示的に無効にさえされています。したがって、std::ifstreamオブジェクトをパラメータに値で渡すことはできません。

+0

コンストラクタをコピーします。とった。感謝の気持ちを見てください! –

2

値渡しはコピーコンストラクタを必要とするため、これを行うことはできません。しかし、コピーコンストラクタは、他の一方で、コピーコンストラクタを必要としないので、許可されて、ポインタまたは参照で渡しstd::basic_istreamレベル*

basic_istream(const basic_istream& rhs) = delete; 

explicitly deletedです。

*delete機能をC++ 11に導入する前に、コンストラクタはprivateでした。

+0

C++ 11以降でのみ明示的に削除されます。 –

+0

@RemyLebeau注意していただきありがとうございます。私はC++ 11の機能を「新しいデフォルト」として、C++ 14を「新しい最先端」として考えていますが、そこには多くのC++ 98コードがあると確信しています。 – dasblinkenlight

+0

コピーコンストラクタを推測すると、このファイルをコピーする方法の定義に似ていますか?私はまだこの言葉を見ていない。私は最近、クラスで始めました。 –

関連する問題