#include <iostream.h>
#include <conio.h>
指摘されているように、C++ プログラムの標準ヘッダーではありませんiostream.h
。conio.h
IO ストリーム ライブラリの正しいヘッダー インクルード ステートメントは#include <iostream>
、拡張子なしの です。
typedef ostream& (*T)(ostream& , int);
これにより、次のプロパティを持つ関数へのポインターであるtypedef
名前付きが作成されます。T
- への参照を返します
ostream
- 次の順序で 2 つのパラメーターを受け入れます。
ostream
は、それが を参照していると仮定すると、std::ostream
それ自体がC++ 標準ライブラリにある の です。次のように定義されています。typedef
std::basic_ostream
namespace std {
typedef basic_ostream<char> ostream;
}
オブジェクトstd::cout
は のインスタンスですstd::ostream
。
class Base
{
T fun; // (1)
int var; // (2)
public:
Base(T func, int arg): fun(func) , var(arg) {}; // (3)
friend ostream& operator<<(ostream& o, Base& obj) // (4)
{
return obj.fun(o, obj.var);
}
};
これは、(1) 上記の関数へのポインターと (2) 整数の 2 つを保持するクラスです。コンストラクター (3) により、クラスのユーザーは、関数ポインターと整数を使用してクラスをインスタンス化できます。
フレンド関数宣言 (4) は、左ビットシフト演算子をオーバーロードし<<
ます。この種のオーバーロードは、演算子のオーバーロードと呼ばれます。慣例により、オペレーター<<
は、IO ストリームのコンテキストではストリーム挿入オペレーターとも呼ばれます。
このように定義されたフレンド関数は、実際には のメンバーでBase
はないため、ポインターを受け取らないことに注意してくださいthis
(したがって、別のBase&
パラメーターが必要です)。
ostream& odisp(ostream& o, int i);
{
o << "i=" << i << endl;
return o;
}
と呼ばれる機能odisp
です。ostream
および整数への参照を受け取ります。整数 42 を渡すと、渡された整数が次の形式で出力されます。
i=42
Base disp(int i)
{
return base(odisp, i)
};
この関数には複数の構文エラーがあり、そのままでは実行されません:
base
はおそらく意図されたものBase
です。この場合、Base
テンポラリを作成して返します。
- セミコロンがありません。
これらの問題は、言語にとってある程度基本的なものです。これらの問題をカバーする優れた C++ の入門書を入手することをお勧めします。