2012-04-09 64 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的