0

アーティスト名 (文字列)、アルバムタイトル (文字列)、およびトラック オブジェクトのリスト (ベクター) を格納するように設計されたアルバム クラスがあります。「<<」演算子をオーバーロードして、ストリームベースの出力を有効にしようとしています。

関連するコードは次のとおりです。

std::ostream& Album::printTracks (std::ostream &out, std::vector<Track> &t)
{
    unsigned int i;
    for (i=0; i<t.size(); i++)
        out << " " << t.at(i);
     return out;
}
std::ostream& operator<< (std::ostream &out, Album &a)
{
    out << "Artist name: " << a.artistName << "\n" <<
        "Album Title: " << a.albumTitle << "\n" <<
        "Tracks: " << a.printTracks(out,a.getTracks());
    return out;
}

次の順序で印刷する必要があります。

  • アーティスト名
  • アルバムのタイトル
  • トラックリスト

代わりに、テスト データを与えると次のように表示されます。

  • トラックリスト
  • アーティスト名
  • アルバムタイトル

「トラック:」の後にメモリの場所が続きます。

Constructor for "Track Class" is:
Track::Track (std::string t, Duration* d)
    {
        title = t;
        duration = d;
    }

「トラック」クラスで「<<」をオーバーロードするコードは次のとおりです。

std::ostream& operator<< (std::ostream &out, Track &t)
    {
    out << "Title: " << t.title << "\n" <<
        "Duration: " << *t.duration << "\n";
    return out;
    }

出力に使用される最終的なコードは次のとおりです。

Duration* d = new Duration(3,4,50); //creating duration objects for testing
Duration* d2 = new Duration(5,7,300);
Duration* d4 = new Duration(3,3,50);
Track t1 = Track("Test",d); //creating track objects
Track t2 = Track("Test2",d2);
Track t3 = Track("Test3",d4);
std::vector<Track> tracks; //forming tracks into vector
tracks.push_back(t1);
tracks.push_back(t2);
tracks.push_back(t3);
Album a = Album("Test Artist","Test Album",tracks); //create album object
cout << a << endl; // output album object

注文が期待どおりに印刷されないのはなぜですか?

4

1 に答える 1

5

引数が評価される順序は指定されていません。そのうちの 1 つには副作用 (トラックの出力) があるため、最初に評価された場合は、それらが最初に出力されます。

于 2012-12-13T01:19:43.000 に答える