istream ostream iostream について 継承とinclude の気になったメモ
ostream と istreamのメモです。ゲームプログラミングではほとんど使いませんが、知っていて損ということはないので勉強したことをメモします。
今回勉強して新発見があったとすれば、coutはostreamのcinはistreamのインスタンスだということ(cinのextern宣言はiostreamで発見)、これは勉強していく中で適当に予想はしていたのですが、予想のままだとずっとモヤモヤする性分なのではっきりわかって御の字。私は教える立場でもならないと常に思って勉強しているので、細かいとこまで追求したいものですね。
話を戻します。正確にいうとクラスの継承は・・・
stringstream と fstream はiostreamの派生(iostreamを継承していると言いかえてもいい)。
そのiostreamは istreamと iostreamの派生だそうです。参考ロベールのC++
ostreamもistreamもiostreamでインクルードされているので既にインクルードしているならば明示的にする意味以外に必要はないでしょう。
上の文章をなぜ消したかというと嘘だからです。継承しているならヘッダファイルをインクルードしているんじゃないかと予想していましたが見事に間違いでした。fstreamをインクルードしてもcinやcoutが使えないのです。(継承はしているがヘッダファイルはインクルードはしていませんでした)
ここまで来て疑問のまま放置するのは嫌なので、実際にヘッダファイルを読んでインクルード関係も調べてみました。
インクルード先------------------------------------------------------->inc元
......<- ios <- ostream <- istream <- iostream
↑<-------- fstream
↑<-------- iterater <- string <- sstream
cinについてですが、
iostreamのファイルの中でextern istream cin,とされてました。
ここからは予想になりますが、iostreamの定義用のファイルがあって(予想),その中でcinをインスタンス(実体化) しているんじゃないでしょうか。※間違っていたら恐縮ですがご指摘ください。
ちなみに中身はこんな感じでした。
// fstream standard header
#pragma once
#ifndef _FSTREAM_
#define _FSTREAM_
#include <istream>ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
省略
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
template<class _Elem, class _Traits>
class basic_fstream
: public basic_iostream<_Elem, _Traits>
テンプレートで作られてました。
継承はしているがヘッダファイルはインクルードはしていないなんてどう実装しているか気になったのですが、中身で高度なことをしていてdifineもおおくて正直これ以上読むのが困難でした。悔しいです。これからまた勉強していって力をつけます。
※今回のメモに間違いがあればご指摘ください。お叱りだと思って精進します。