2014-09-03 75 views
-2

我会直接进入一个例子,我认为它更容易失败。 音乐Cd有曲目。如何访问音乐Cd类中的“TrackInfo”矢量(XTrackInfo)数据? 我想打印,甚至改变价值观,我不知道如何。 感谢C++如何访问由Composition创建的矢量数据?

#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); 
} 
+0

这是一门功课的问题吗?您可以在XMusicCd方法中使用XTrackInfo的公共接口,例如调用GetTrackName()。 – Jens 2014-09-03 16:11:34

+0

它不像你在@Messa中看到的那样明显。 – marco 2014-09-03 16:23:52

+1

答案仍然很明显,但问题不是:-)如果你用一些代码行写了一个非常小的例子,说“在这里我想做这个或那个,但我不知道怎么样”。只是syaing“我怎么可以访问”我不清楚。 – Jens 2014-09-03 16:48:51

回答

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; 
} 
+0

我试过用循环与自动keywork。我真的需要创建另一个矢量,轨道吗? 我觉得这似乎很“新手”的答案,但我从来没有用过stl。 – marco 2014-09-03 16:25:14

+1

GetTracks已经返回副本。您可以将其更改为返回引用。见http://stackoverflow.com/questions/2182408/return-a-const-reference-or-a-copy-in-a-getter-function – Messa 2014-09-03 23:58:28