2012-01-14 24 views
0

クラス内のベクトルにいくつかの曲を追加しようとしています。私が格納している値の1つは、その曲を表すintです。本質的にカウンターです。私が追加する最初の曲は、値1、2番目の値2などが必要です。しかし、それは大きな乱数(ポジティブとネガティブ)のような他の奇妙な値を得ています。私が間違っていることを頭の中で包み込むことはできません。これはコードです:int/counterの奇妙な振る舞い

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

class Jukebox{ 
public: 
    void addSong(string artist, string title, string filename) { 
    song s {++songCounter, artist, title, filename}; 
    Songs.push_back(s); 
    } 

    void printSong (int song) { 
    cout << Songs[song].no << ". "; 
    cout << Songs[song].artist << " - "; 
    cout << Songs[song].title << " : "; 
    cout << Songs[song].filename << endl; 
    } 

private: 
    struct song { 
    int no; 
    string artist; 
    string title; 
    string filename; 
    }; 
    vector<song> Songs; 
    int songCounter; 
}; 

int main() { 
    Jukebox jbox; 
    jbox.addSong("U2", "Magnificent", "U2-Magnificent.mp3"); 
    jbox.addSong("Sting", "Englishman in New York", "Sting-Englishman_in_New_York.mp3"); 
    jbox.addSong("U2", "One", "U2-One.mp3"); 
    jbox.printSong(0); 
    jbox.printSong(1); 
    jbox.printSong(2); 
    return 0; 
} 

更新

[OK]を、私はおそらく愚かだとこれを実装しようとする前に、クラスについての詳細をお読みください。しかし、私は読んだと思うが、私はまだそれを取得しません。これは、(動作しませんている)私のクラスは今、次のようになります。

class Jukebox(): songCounter(0) 
{ 

public: 
    void addSong(string artist, string title, string filename) { 
    songCounter++; 
    song s {songCounter, artist, title, filename}; 
    Songs.push_back(s); 
    } 

    void printSong (int song) { 
    cout << Songs[song].no << ". "; 
    cout << Songs[song].artist << " - "; 
    cout << Songs[song].title << " : "; 
    cout << Songs[song].filename << endl; 
    } 

private: 
    int songCounter; 
    struct song { 
    int no; 
    string artist; 
    string title; 
    string filename; 
    }; 
    vector<song> Songs; 
}; 

決勝単語

[OK]をクリックします。私が見たC++のコンストラクタクラスの例から、私は彼らがどのように働いたかについて間違った印象を受けました。今私はそれを少し増やしていると思う。しかし構文はまだ私にとっては奇妙に思えます。しかし、私はもっと読むことを試みるので、私はそれを本当に理解しています。ここに私がやったことで、動作しているようですし。

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

class Jukebox { 

public: 
    void addSong(string artist, string title, string filename) { 
    songCounter++; 
    song s {songCounter, artist, title, filename}; 
    Songs.push_back(s); 
    } 

    void printSong (int song) { 
    cout << Songs[song].no << ". "; 
    cout << Songs[song].artist << " - "; 
    cout << Songs[song].title << " : "; 
    cout << Songs[song].filename << endl; 
    } 

    Jukebox(): songCounter(0) {} // Constructor 

private: 
    int songCounter; 
    struct song { 
    int no; 
    string artist; 
    string title; 
    string filename; 
    }; 
    vector<song> Songs; 
}; 

int main() { 
    Jukebox jbox; 
    jbox.addSong("U2", "Magnificent", "U2-Magnificent.mp3"); 
    jbox.addSong("Sting", "Englishman in New York", "Sting-Englishman_in_New_York.mp3"); 
    jbox.addSong("U2", "One", "U2-One.mp3"); 
    jbox.printSong(0); 
    jbox.printSong(1); 
    jbox.printSong(2); 
    return 0; 
} 

答えて

4

あなたのコンストラクタでsongCounterを初期化しませんでした。

Jukebox(): songCounter(0),//....other members 

初期化しないと、ランダムな値があり、プログラムが未定義状態になることがあります。

ユニット化された変数を使用する際には常に注意が必要です。未定義の動作があり、プログラムが良い例です。

また、私はあなたのデザインのを確認していないが、あなたはあなたの Songクラスのすべてのオブジェクトの状態を維持してカウンタ、としてそれを使用したい場合は、おそらくそれは staticメンバーである必要があります。

Songオブジェクトの作成時に明示的に適切な値に設定する必要があります。

これは、JukeBoxのカウンターで、Songのカウンターではありませんので、まだメンバーになることができます。

+0

なぜ静的ですか?あなたは...それはそれは 'Jukebox'の一員として完全に大丈夫ですが、それはintializedする必要がない、静的である必要はありません –

+0

...あなたの本を聞いて申し訳ありません – Nim

+0

を各ジュークボックスに異なるカウンタを持つことができます。しかし、コードスニペットを少し拡張できますか?私はそれを得ないので。以前はpythonだけしか知りませんでしたが、 'songCounter(0)'はsongCounterという名前の関数を呼び出すのと同じように見えますが、変数です。私が思うことをやろうとすると、それは間違いを起こす。私が試したことを知りたいのであれば、その質問を更新することができます。 –

1

変数songCounterを初期化していません。あなたがsongCounterを初期化します

Jukebox(): songCounter(0) {} 
+0

:-)(でも、私は私が何かを切り抜いをコーディングしようとしている前に、プログラム全体を終了しないだろうと思いました)。わかった。投票してください! C/C++の変数の –

1

Jukeboxのクラス定義に以下を追加しますか? C++では、プリミティブはデフォルトでゼロに初期化されません。コンストラクタに

: songCounter(0) 

を追加する必要があります。

+0

Inializationは、それが宣言された変数のストレージクラス( 'static'、' register'など)に依存します(彼らはプリミティブか非プリミティブであるかどうか)、その種類には依存しません。 –

+0

デフォルトの初期化は、クラス型のデフォルトコンストラクタを呼び出すデフォルトは配列型のためのすべての配列要素を初期化し、(例えば、プリミティブのために)それ以外の場合は何もしないが含まれます。統計はゼロ初期化されていますが、これは異なっています。 –

+0

うん。わかった。投票してください! –

1

私はあなたが0であることをsongCounterを初期化するべきだと思いますがJukeboxのコンストラクタを必要とし、その中で、あなたは0

+0

うん。わかった。投票してください! –

1

にカウンタを初期化する必要があります。クラスの公開部分で:

public Jukebox() : songCounter(0) {} 
+0

うん。わかった。投票してください! –