2012-04-09 15 views
0

私のモデルは非常にシンプルですが、使用しているベクターにいくつか問題があります。オブジェクトがベクターにプッシュされたときに出力がありません

基本的には、1つのプレイリストを持つソングクラスがあり、プレイリストには複数のトラック(ベクトル内)を持つことができます。

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をしてください投稿できますか? –

+2

ええと。あなたは 'playlist'ポインタを初期化しますか? – arrowd

答えて

4

@ルシアンはすでに指定していますあなたが見た問題を解決するには合理的なスタートですが、私はやや異なるルートを提唱します。あなたがそれらを必要としないとき

class Playlist { 
    vector<Track> tracklist;  
public: 
    void addTrack(Track const &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() << "\n"; 

...とあなたは、スマートなポインタクラスの何らかの形でそれらを包むことをほぼ確実に望みます。この場合、私は後者が必要であるか、おそらく有用であるというヒントは見ません。

+0

+1 for * "必要なポインタはあまりにも珍しく、必要なときにはスマートなポインタクラス" *でそれらを囲むことがほとんどです。それは私にとってはホームランです。 –

+0

あなたの提案をありがとう、私はポインタよりも切り替えています。これは私のオブジェクトをもはや初期化する必要がないことを意味しますか?あなたがルチアンがしていた間に、あなたの事例であなたがそれをしなかったことに気がついたからです。 – networkprofile

+0

@Sled:オブジェクトは初期化する必要がありますが、通常はコンストラクタで発生します。クライアントコードは単にctorにパラメータを提供します(実際には答えのコードの 'Song'のようにクライアントが実際にデータを必要とするときにも)。 –

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作成の可能性があります。 –

+0

@Alsはこれを見て、編集しました。 –

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の

関連する問題