0

我的模型非常简单,但我使用的向量存在一些问题。

基本上,我有一个 Song 类,它有一个播放列表,一个 Playlist 可以有多个轨道(在一个向量内)。

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);
    }
};
4

3 回答 3

4

您正在调用undefined behavior,这意味着任何事情都可能发生,通过访问一个无效的指针:

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);
于 2012-04-09T16:51:19.360 回答
3

@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);
    }
};

一开始就需要指针是相当不寻常的,当您确实需要它们时,您几乎肯定希望将它们包装在某种智能指针类中。在这种情况下,我看不到后者是必要的或什至可能有用的暗示。

于 2012-04-09T16:57:53.777 回答
2
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

于 2012-04-09T16:58:27.263 回答