私は、HDF5 C++ バインディングのいくつかの欠点を回避する方法を考え出そうとしています。現在、私のコードには、次のような try/catch ブロックが散らばっています。
H5::Exception::dontPrint();
H5::H5File *file = NULL;
try {
file = new H5::H5File(fname.c_str(), H5F_ACC_RDWR);
} catch(H5::FileIException &file_exists_err) {
file = new H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
}
これは必要ないはずです。やりたいことは、読み取り/書き込みアクセス用にファイルを開き、存在しない場合は作成することだけです。もう 1 つの厄介な問題は、親グループが必ずしも存在しないネストされたグループ (例: "/parent/group") を作成することです。Unix/Linux では、同等のものは次のようになります。
mkdir -p parent/group
ただし、HDF5 C++ バインディングでは、親グループが存在しないグループを作成すると、例外が発生します。
これらの理由から、これらの一般的な問題のいくつかを扱うヘッダー ファイルを作成することにしました。私が最初に考えたのは、たとえば、ファイル名とアクセス モードを取得して H5::H5File オブジェクトを返す関数、またはグループ名を取得してグループ オブジェクトを返す関数のセットを単純に作成することでした。ただし、プログラマーが自分のコードで明示的に「new」を呼び出すことは決してないにもかかわらず、このヘッダー ファイルを使用して返されたオブジェクトで「delete」を呼び出すプログラマーを残すため、これは理想的ではないと思います。これはメモリリークを求めているようです。
したがって、私の 2 番目の考えは、H5::H5File と H5::H5Group から一連の派生クラスを作成し、ファイルがまだ存在しない場合、またはグループの親グループがまだ存在しない場合に例外をスローしないコンストラクターを作成することでした。 . 派生ファイル クラスに対する私の試みは次のとおりです。
namespace H5Utils {
class H5File : public H5::H5File {
public:
H5File(std::string fname);
~H5File();
};
}
H5Utils::H5File::H5File(std::string fname)
try : H5::H5File(fname.c_str(), H5F_ACC_RDWR)
{
std::cerr << "Opened existing file." << std::endl;
} catch(H5::FileIException &file_exists_err) {
std::cerr << "File does not exist. Creating new file." << std::endl;
H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
}
H5Utils::H5File::~H5File() { }
私が直面している問題は 2 つあります。まず、コンストラクターの try/catch ブロックが、によって作成された例外を再スローします。
H5::H5File(fname.c_str(), H5F_ACC_RDWR)
ファイルが存在しない場合、プログラムは引き続き終了します。2 番目の問題は、2 番目のコンストラクターが
H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
正しいです (つまり、親クラスを構築しますか?) 派生クラスが基本クラスのコンストラクターで例外をキャッチし、基本クラスの別のコンストラクターを呼び出す方法はありますか?
より一般的には、HDF5 C++ バインディングのこれらの欠点に対処するためのより良い/よりエレガントな方法を考えられる人はいますか?