c ++如何访问Composition创建的矢量数据?

时间:2014-09-03 16:05:25

标签: c++ c++11 stdvector

我会直接举一个例子,我认为这更容易让人感到厌烦。 Music Cd有曲目。如何访问音乐Cd类中的“TrackInfo”矢量(XTrackInfo)数据? 我想打印甚至更改值,我不知道如何。 感谢

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

#include <iterator>
#include <numeric>



class XTrackInfo
{
    std::string m_TrackName;
    int m_Length;

public:
    XTrackInfo() {}

    XTrackInfo(std::string TrackName, int Length):
        m_TrackName(std::move(TrackName)),
        m_Length(Length)
    {}

    void SetTrackName(std::string TrackName) { m_TrackName = std::move(TrackName); }
    void SetTrackLength(int Length) { m_Length = Length; }
    const std::string& GetTrackName() const { return m_TrackName; }
    int GetTrackLength() const { return m_Length; }
};

class XMusicCd
{
private:

    std::string m_Author;
    std::vector<XTrackInfo> m_TrackInfo;

public:

    XMusicCd() {}
    XMusicCd(std::string Author, std::vector<XTrackInfo> Tracks):
        m_Author(std::move(Author)),
        m_TrackInfo(std::move(Tracks))
    {}

    void SetAuthor(std::string Author) { m_Author = std::move(Author); }

    const std::string& GetAuthor() const { return m_Author; }
    const std::vector<XTrackInfo> GetTracks() const { return m_TrackInfo;}

    int GetLength() const; // Left incomplete on purpose; you will implement it later


    void AddTrack(XTrackInfo NewTrack){

        m_TrackInfo.emplace_back(std::move(NewTrack));

    }


};



void PrintCdContents(const XMusicCd& Cd)
{

    std::cout << "Author : " << Cd.GetAuthor() << "\n";
    std::cout << "\n" << std::endl;
    std::cout << "Track Info" << std::endl;

   //problems here :)


}

int main()
{
    // You may not change this function
    XMusicCd MyCd;
    MyCd.SetAuthor("Hello World");
    MyCd.AddTrack(XTrackInfo("This is a test", 100));
    MyCd.AddTrack(XTrackInfo("This is a test 2", 200));
    PrintCdContents(MyCd);
}

1 个答案:

答案 0 :(得分:1)

使用迭代器:

std::vector<XTrackInfo> tracks = Cd.GetTracks();
for (std::vector<XTrackInfo>::const_iterator it = tracks.begin(); it != tracks.end(); ++it) {
    std::cout << it->GetTrackName() << std::endl;
}

或索引:

std::vector<XTrackInfo> tracks = Cd.GetTracks();
for (unsigned i = 0; i < tracks.size(); ++i) {
    std::cout << tracks.at(i).GetTrackName() << std::endl;
}