3
ostream& operator <<(ostream& osObject, const storageRentals& rentals)
{
    osObject << rentals.summaryReport();
    return osObject;
}

summaryReport()はvoid関数であり、エラーが発生します。

これらのオペランドに一致する演算子「<<」はありません

summaryReportただし、関数をに変更してもエラーは発生しませんがint、値を返さなければならないという問題があり、画面に出力されます。

void storageRentals::summaryReport() const
{
   for (int count = 0; count < 8; count++)
      cout << "Unit: " << count + 1 << "    " << stoUnits[count] << endl;
}

cout <<void関数でオーバーロードする方法はありますか?

4

4 に答える 4

11

次に示すように、パラメータとしてsummartReport取得を定義する必要があります。ostream&

std::ostream&  storageRentals::summaryReport(std::ostream & out) const
{
    //use out instead of cout
    for (int count = 0; count < 8; count++)
        out << "Unit: " << count + 1 << "    " << stoUnits[count] << endl;

    return out; //return so that op<< can be just one line!
}

それからそれを次のように呼びます:

ostream& operator <<(ostream& osObject, const storageRentals& rentals)
{
    return rentals.summaryReport(osObject); //just one line!
}

ちなみに、「オーバーロードカウト」とは呼ばれていません。「のオーバーロード」operator<<std::ostreamと言う必要があります

于 2012-04-24T03:36:41.203 に答える
0

ここで行う必要があることは2つあります。テイクを作成storageRentals::summaryReport()します(デフォルトでこれをに設定std::ostream&できます):std::cout

void storageRentals::summaryReport(std::ostream& os) const
{
    for (int count = 0; count < 8; count++)
    {
        os << "Unit: " << count + 1 << "    " << stoUnits[count] << endl;
    }
}

それからそれをこう呼んでください:

ostream& operator <<(ostream& osObject, const storageRentals& rentals)
{
    rentals.summaryReport(osObject);
    return osObject;
}

storageRentals::summaryReport()注: takeを作成する利点は、ユニットテストでstd::ostream&合格し、std::ostringstream正しい出力を提供していることを表明できることです。

于 2012-04-24T03:38:37.460 に答える
0

過負荷coutになると、他の場所を使用codeして理解しづらくなったり、混乱したりする可能性があります。実際、あなたは仕事を完了するためにあなた自身のクラスを作ることができます。たとえば、クラスを作成し、class MyPringそのをオーバーロードしoperator <<ます。

于 2012-04-24T03:42:24.963 に答える
0

ストレージレポートは暗黙的に常にcoutにストリーミングされます。誰かがあなたの関数をこのように呼び出し、ファイルの代わりにcoutにレンタルを持っていると想像してください。

fstream fs("out.txt");
storageRentals rentals;
fs << rentals;

次のようにクラスをストリーミングしてみませんか。

ostream& operator <<(ostream& osObject, const storageRentals& rentals)
{

  for (int count = 0; count < 8; count++) {
      osObject << "Unit: " << count + 1 << "    " << rentals.stoUnits[count] << endl;
  }
  return osObject;
}

stoUnitsメンバーがプライベートの場合は、ストリーム関数をストレージクラスのフレンドにする必要があります。

friend ostream& operator<<(ostream& osObject, const storageRentals& rentals);
于 2012-04-24T03:45:32.580 に答える