クラスのメンバとして HANDLE があり、それは win32 api を使用して取得したファイル ハンドルであると言っています。コピー コンストラクタでそれを処理するにはどうすればよいですか?
3 に答える
(値ではなく) 抽象リソースを含むクラスのコピー コンストラクターを定義しようとしているため、この問題が発生しています。コピー コンストラクターから実際に必要な動作を決定する必要があります。おそらく、そもそもクラスをコピー構築可能にしたくないでしょう。
たとえば、開いている読み取り専用ファイルをクラスでカプセル化するとします。次に、コピー コンストラクターが DuplicateHandle を呼び出し (Matt によって提案されているように)、デストラクタが CloseHandle を呼び出すことは理にかなっています。ファイルを書き込んでいないため、元のインスタンスとコピーされたインスタンスの間に干渉はありません。
一方、クラスが一時ファイルを表す場合は、異なるセマンティクスが必要になる場合があります。おそらく、コピー コンストラクターがファイル全体をコピーして、クラスのコピーが元のファイルに干渉しないようにすると便利です。または、この動作が暗黙的すぎると感じ、クラスにコピー コンストラクターがないと判断し、代わりにコピー メソッドを明示的に使用する必要がある場合もあります。
したがって、正確に何をしているのか、およびクラスを使用する方法を説明しない限り、「正しい」答えはありません。
他の人が示唆しているように、DuplicateHandleはおそらくここで最も理にかなっていますが、HANDLEは基本的にポインターであるため、CloseHandleをdeleterとして使用してstd::shared_ptr(またはブーストの対応物)を使用することもできます。その後、ハンドルは好きなだけコピーでき、クラスの最後のインスタンスが破棄されると自動的に閉じられます。
ハンドルが共有されていることに注意してください。関連する状態を変更すると、そのハンドルを参照しているすべてのインスタンスで変更されます。それが問題である場合、私はそれを複製するか、完全にコピーすることを禁止します.
ハンドルをコピーする場合は、コピー コンストラクターでWindows API DuplicateHandleを使用できます。この場合、ハンドルを使用しなくなったら、Closehandle を呼び出します。