- ベストアンサー
union共同体の使い方…
typedef union { A_FILE* aFile; B_FILE* bFile; }C_FILE; 上記のようにunion共同体で2つの型を 対応するものを作りました。 ファイルをオープンするのに C_FILE file_Open( const char *filename); というI/Fを作りました。 でもファイルをクローズする時に ファイルハンドルを渡そうと思うのですが、 ファイルハンドルの引数をどっちの型が入っても よいようにしたいのですが。 int file_Close(C_FILE.aFile Fp) ←これでは意味がない… int file_Close(C_FILE Fp) ←こういう使い方は出来ませんよね? ファイルオープン側に実体を持ったままで、 どっちの型が入ってもよいファイルクローズを行う I/Fを作るのは無理なのでしょうか。 やはり実体は呼びだす側にあるべきなのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
unionってなんでもかんでも同じメモリ領域にガンガンいれる為のものです。 目的は容量節約であったり、ほかの型の物を参照したいときに使ったりします。 araponさんはオーバーロード的な使い方をしたいようですが、基本的にそれは無理です。 #プリプロセッサをうまく使えばできるかもしれませんが、 #返ってソースが汚くなるかと >I/Fを作るのは無理なのでしょうか。 >やはり実体は呼びだす側にあるべきなのでしょうか? メンバにA_FILEであるかB_FILEであるかの情報を もたす必要があると思います。
その他の回答 (2)
- tatsu99
- ベストアンサー率52% (391/751)
参考までにお聞きしたいのですが、 A_FILE* aFileとB_FILE* bFile; では、なにが違うのでしょうか? A_FILEとB_FILEとに分ける理由を説明していただけませんでしょうか。
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 と同じですが, 結局 A_FILE か B_FILE かを区別するのにメンバが 1つ必 要なので, struct を使って typedef struct { int type; union { A_FILE *a_file; B_FILE *b_file; }; } C_FILE; くらいかな? 無名 union が使えなかったら, 適当に名前を付けてやってくだ さい.