1

オペレーターのオーバーロードによる印刷に問題があります。現在、Item クラスを基本クラスとして含むデータベースを作成しています。Item から派生したクラスは、Movie、Book、および MusicAlbum です。ライブラリに本を挿入する方法の例を次に示します。

Item    *item;

cout << ">>>>>> adding items to library:" << endl << endl;
item = library->addBook("The Curious Incident of the Dog in the Night-Time",  "Mark Haddon", 240);
if (item != NULL) {
    library->addKeywordsForItem(item, 2, "autism", "Asperger's Syndrome");
    cout << item << endl;
    }

addBook はクラス Library で定義されている関数であり、addKeywordsForItem も同様です。私の問題は次の行です: cout << item << endl;

これを行うには、ストリーミング << 演算子をオーバーロードする必要があることは理解していますが、メイン関数 (上記のコードの元) には、映画や音楽アルバムを追加するための同様の関数も含まれています。ストリーミング演算子をオーバーロードする関数は基本クラスにあり、次のように基本クラス ポインターをパラメーターとして受け取ります。

ostream& operator<<(ostream& out, const Item* item);

本の場合、タイトル、著者、ページ数、およびキーワードを出力する必要があります。映画や音楽アルバムの場合、それらから印刷する特定のものもあります。

ストリーミング演算子をオーバーロードする基本クラスの 1 つの関数だけを使用して、必要な情報を出力するにはどうすればよいですか? 基本クラスのポインターが Book、Movie、または MusicAlbum のインスタンスを参照しているかどうかに関係なく? 前もって感謝します。

4

1 に答える 1

2

通常は、仮想関数に転送するグローバル オーバーロードを使用します。

struct Base {    
    virtual std::ostream &print(std::ostream &os) const { 
        return os << base_data;
    }
};

struct Derived : Base {     
    virtual std::ostream &print(std::ostream *os) const { 
       return os << derived_data;
    }
};

std::ostream &operator<<(std::ostream &os, base const &b) { 
    return b.print(os);
}

各派生クラスはprint、ストリームに出力するために必要に応じてオーバーライドされます。operator<<は参照によって を取得するため、Base通常の仮想ディスパッチを使用して、print受信したオブジェクトの動的な型に基づいて正しいクラスの の実装に転送できます。

于 2012-12-11T05:20:54.800 に答える