オブジェクトごとにテンポラリ・ファイルに一旦データを出しておき,
プログラムの最後にテンポラリ・ファイルを読んで結果を出すというような
ものを作ろうとした.クラスの骨組みはこんな感じ.
class A{
static int nofInstance; // number of instance
char filename[128]; // name of temporary file
protected:
ofstream temp;
public:
A( );
~A( );
friend char* output_name( const A &module );
friend void flush_output( A &module ); // 出力を flush する.
};
テンポラリを読むためのフレンド関数を用意しておく.
ちなみに実際に僕が作ったものでは,この2つのフレンド関数は
特定のクラスのメンバ関数にして,そのクラスからだけ
呼ぶようにしてある.2つのフレンド関数の定義は,
void flush_output( A &module ){
module.temp.flush( );
return;
}
// temporary file name を返す
char* output_name( const A &module ){
return module.filename;
}
とする.関数 flush_output( ) は,実際にテンポラリ・ファイルを
読むときに,それまでに temp に出力された情報がすべて
実際にファイルに書き込まれているようにするために必要.
それから,class A の定義のところで,変数 nofInstance を用意しておく
理由については,コンストラクタを見れば分かるということで,
コンストラクタはこんな感じ.
int A::nofInstance = 0;
A::A( ){
++nofInstance;
sprintf( filename, "/tmp/.A_class%03d.dat", nofInstance );
temp.open( filename );
}
nofInstance は,オブジェクトごとにテンポラリを分けるためということ.
コンストラクタの定義の前に,nofInstance を初期化している.
こんなことできるのかと思ったらできてしまったのでそうしている.
そしてデストラクタ,
A::~A( ){
temp.close( );
remove( filename );
}
C++ は,デストラクタで temp を消去してしまえるから,
後始末関数を呼ぶ必要がないというのがいい.
なお,remove( ) 関数は,Cの stdio.h で定義されているライブラリ関数らしいので,
cstdio をインクルードしておく必要はある.
|