2012-04-09 69 views
0

我的模型很簡單,但我遇到了一些我正在使用的向量的問題。當對象被推送到向量時沒有輸出

基本上,我有一個歌類有一個播放列表,並且播放列表可以有多個軌道(在一個向量中)。

Song* song = new Song("Rien de rien", "Biggy", 120); 
Playlist* playlist; 
Track* synthTrack; 

playlist->addTrack(synthTrack); // without this line everything works fine 
song->setPlaylist(playlist); 

cout << "Title " + song->getTitle() << endl; 

控制檯不給我任何錯誤,但cout沒有顯示出來。只要向我的播放列表添加曲目,就會發生這種情況。

這是我的播放列表類的樣子:

class Playlist { 
private: 

    vector<Track*> tracklist; 

public: 
    void addTrack(Track* track){ 
     this->tracklist.push_back(track); 
    } 
}; 
+3

你能張貼http://sscce.org好嗎? – 2012-04-09 16:49:40

+2

嚴。你初始化'playlist'指針嗎? – arrowd 2012-04-09 16:50:02

回答

4

@Lucian已經給出一個合理的開始在解決你所看到的問題,但我會提倡一個有點不同的路線。我會在相關代碼擺脫所有的指針開始:

Song song("Rien de rien", "Biggy", 120); 
Playlist playlist; 
Track synthTrack; 

playlist.addTrack(synthTrack); 
song.setPlaylist(playlist); 

cout << "Title " << song.getTitle() << "\n"; 

...和:

class Playlist { 
    vector<Track> tracklist;  
public: 
    void addTrack(Track const &track){ 
     tracklist.push_back(track); 
    } 
}; 

孤男寡女指針是相當不尋常的開始,當你需要他們,你幾乎可以肯定地想把它們包裝在某種智能指針類中。在這種情況下,我沒有看到後者是必要的或可能甚至有用的暗示。

+0

+1 for *「需要指針是非常不尋常的開始,當你確實需要它們時,你幾乎可以肯定想把它們包裝在某種智能指針類中*。這對我來說是一個本壘打。 – 2012-04-09 17:03:48

+0

感謝您的建議,我從指針轉換而來。這是否也意味着我不需要初始化我的對象了?因爲我注意到你在Luchian做的時候並沒有這樣做。 – networkprofile 2012-04-09 18:25:37

+0

@Sled:對象需要初始化,但通常會在構造函數中發生。客戶端代碼僅向ctor提供參數(甚至當ctor實際需要來自客戶端的數據時,例如答案中的代碼中的「Song」)。 – 2012-04-09 18:39:27

5

你調用未定義行爲,這意味着任何事情都可能發生,通過訪問無效指針:

Playlist* playlist; 
Track* synthTrack; 

playlist->addTrack(synthTrack); // using uninitialized pointer 

應該

Playlist* playlist = new Playlist; //initialize playlist here 
Track* synthTrack = new Track; //also initialize synthTrack 

playlist->addTrack(synthTrack); 
+0

'synthTrack'仍然是未初始化和未分配的,並且是潛在的UB。 – 2012-04-09 16:53:31

+0

@Als剛剛看到,編輯。 – 2012-04-09 16:53:53

3
class Playlist 
{ 
private: 
    vector<Track> tracklist; 

public: 
    void addTrack(const Track& track){ 
     tracklist.push_back(track); 
    } 
}; 


Song song("Rien de rien", "Biggy", 120); 
Playlist playlist; 
Track synthTrack; 

playlist.addTrack(synthTrack); 
song.setPlaylist(playlist); 

cout << "Title " + song.getTitle() << endl; 

,或者如果你想避免複製使用std ::的unique_ptr或std :: shared_ptr的