2016-03-31 15 views
2

ファイルから読み書きする機能を簡単に与えるために、WindowsのファイルHANDLEをラップするクラスを作成しているとします。クラスには、ファイルからデータを読み取るread(buffer& out)という関数があります。file read()const correctness

質問は、read()constである必要がありますか?

一方、ファイルを変更しないので、constである必要があります。 一方、HANDLE(HANDLEをどこに読み込むかを示すファイルに変更するため)はconstであってはなりません。

あなたはどう思いますか?

+0

ハーブ・サッターは数年前、C++ 11で「constはスレッドセーフである」と言ったところで話をしました。だから問題は、(クライアント側の)ロックなしで2つのスレッドから 'read()'を安全に呼び出すことです。私は答えがノーだと思うので、関数は 'const'であってはなりません。 –

答えて

3

ファイルハンドルの位置を変更します。

1

私はそれをFileAccessorと呼んでいますが、あなたのクラスのように聞こえて、効果的にファイルの操作を調整しています。ファイルを処理するアルゴリズムを実装する関数を持っていて、output_diagnostics(const FileAccessor& h)を呼び出すことによって何らかの診断情報を表示したいとしたら、output_diagnosticsを呼び出すアルゴリズムに干渉することができない情報はどれですか?おそらくファイル内の現在の位置/バイトオフセットを出力することができます。その位置を取得する関数はconstでなければなりません。ファイルが何らかの形でロックされているかどうか、ファイルのサイズやファイルシステムのパスなど、すべてが公正であるように見えるかもしれません。constしかし、ファイルからreadを実行すると、output_diagnosticを呼び出すアルゴリズムが後でreadを実行し、「現在の位置から切り捨て」などの操作を行う必要があるため、read関数はconstではありません。