Home > 2006-06 / CからC++へ > This Entry [com : 0][Tb : 0]
構造体のメンバ(フィールド)を見れば、どんなデータ構造か大体想像が付くと思いますが、nameはファイル名を、streamはファイル記述子へのポインタを格納するためのものです。この構造体を使うには、オブジェクトを宣言した後、各メンバの初期化が必要になります。struct binary_file
{
char* name;
FILE* stream;
};
そして、使い終わった後で、struct binary_file bfile;
bfile.name = (char*)malloc(FILENAME_MAX);
strcpy(bfile.name, "sample.bin");
bfile.stream = fopen(bfile.name, "rb");
のように、後始末をしなければなりません。これは、非常に面倒な上に可読性も低く、また、間違いを犯す危険性がかなり高いと思います。そこで、コンストラクタやデストラクタの出番となります。上の例を、コンストラクタとデストラクタを使って書き換えてみましょう。fclose(bfile.stream);
free(bfile.name);
構造体の中に、binary_fileという名前の関数と、~binary_fileという名前の関数の定義を書きました。前者がコンストラクタで、binary_file構造体のオブジェクトを宣言したときに呼び出されます。後者がデストラクタで、オブジェクトが生存期間を終えるときに呼び出されます。struct binary_file
{
char* name;
FILE* stream;
binary_file(const char* filename)
: name((char*)malloc(FILENAME_MAX))
{
strcpy(name, filename);
stream = fopen(name, "rb");
}
~binary_file()
{
fclose(stream);
free(name);
}
};
このように、非常にすっきりとした記述になります。また、面倒な記述がなくなったことで、間違いを犯す可能性がほとんどなくなりました。{
struct binary_file bfile("sample.bin");
// 何らかの処理
// スコープから抜けるので、ここでデストラクタが呼び出される
}
http://cppemb.blog17.fc2.com/tb.php/68-3ee2e9b3
Comment