1
#include<iostream.h>
#include<conio.h>

typedef ostream& (*T)(ostream& , int);
class Base
{
    T fun;
    int  var;
    public:
    Base(T func, int arg): fun(func) , var(arg)
    {};
    friend ostream& operator<<(ostream& o, Base& obj)
    {
        return obj.fun(o,obj.var);
    }
};

ostream& odisp(ostream& o, int i);
{
    o<<”i=”&lt;<i<<endl;
    return o;
}
Base disp(int i)
{
    return base(odisp, i)
};

このtypedefがどのように機能するのか理解できないため、最初の行から完全に行き詰まっています..関数構文へのポインタのように見えますが、ostreamには困惑しています..?? このコード全体がどのように機能するかを説明してください..??

4

1 に答える 1

5
#include <iostream.h>
#include <conio.h>

指摘されているように、C++ プログラムの標準ヘッダーではありませんiostream.hconio.hIO ストリーム ライブラリの正しいヘッダー インクルード ステートメントは#include <iostream>、拡張子なしの です。

typedef ostream& (*T)(ostream& , int);

これにより、次のプロパティを持つ関数へのポインターであるtypedef名前付きが作成されます。T

  • への参照を返しますostream
  • 次の順序で 2 つのパラメーターを受け入れます。
    • への参照ostream
    • int価値

ostreamは、それが を参照していると仮定すると、std::ostreamそれ自体がC++ 標準ライブラリにある の です。次のように定義されています。typedefstd::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++ の入門書を入手することをお勧めします。

于 2013-01-06T08:38:56.290 に答える