2012-01-14 5 views
0

일부 노래를 클래스의 벡터에 추가하려고합니다. 저장하고있는 값 중 하나는 노래를 나타내는 int입니다. 근본적으로 카운터입니다. 내가 추가하는 첫 번째 노래에는 값 1, 두 번째 값 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; 
} 

업데이트, 아마 바보와이를 구현하기 전에 클래스에 대한 자세한을 읽어야 할 사람 :이 코드입니다. 그러나 나는 내가 읽었고 나는 아직도 그것을 얻지 않는다고 생각한다. 이것은 (작동하지 않을 것이다) 내 수업은 지금 모습입니다 :

확인

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

최종 단어. 내가 본 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 

초기화하지 않으면 임의의 값이있어 프로그램이 정의되지 않은 상태가됩니다.

unitialized 변수를 사용하는 동안 항상주의해야합니다. 종종 으로 연결되며 정의되지 않은 동작이며 프로그램이 좋은 예입니다.

또한, 나는 당신의 디자인의 확실하지 오전하지만 당신은 당신의 Song 클래스의 모든 객체에 대한 상태를 유지하는 카운터로 사용하려는 경우 아마 그것은 static 구성원이어야합니다.

Song 개체를 만들 때 명시 적으로 적절한 값으로 설정해야합니다.

오케이 그 카운터는 JukeBox이 아니고 Song이 아니므로 여전히 회원이 될 수 있습니다.

+0

정적 인 이유는 무엇입니까? 각 주크 박스에 대해 다른 카운터를 가질 수 있습니다 ... –

+0

정적 일 필요는 없으며 'Jukebox'멤버로서 완벽하게 괜찮습니다.하지만 초기화 할 필요가 있습니다. – Nim

+0

죄송합니다. 하지만 코드 스 니펫을 약간 확장 할 수 있습니까? 왜냐하면 나는 그것을 얻지 못하기 때문입니다. 이전에 파이썬 만 알았던'songCounter (0)'는 songCounter라는 함수를 호출하는 것처럼 보이지만 변수입니다. 내가 생각하는 것을하려고하면 오류가 발생합니다. 내가 뭘했는지 알고 싶다면 질문을 업데이트 할 수있다. –

1

변수 songCounter을 초기화하지 않았습니다. 당신이 songCounter을 초기화 할

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

예. 이제 이해가된다. 투표 해! –

1

:

Jukebox의 클래스 정의에 다음을 추가 하시겠습니까? C++에서 기본 요소는 기본적으로 0으로 초기화되지 않습니다. 생성자에

: songCounter(0) 

을 추가해야합니다.

+0

c/C++에서 변수의 초기화는 선언 된 변수의 저장 클래스 ('static','register' 등)에 의존하여 그 타입에 의존하지 않습니다 (원시 타입이든 비 프리미티브 타입이든). –

+0

기본 초기화에는 클래스 유형에 대한 기본 생성자 호출, 배열 유형에 대한 모든 배열 요소 초기화의 기본값 지정 및 기타 (예 : 프리미티브의 경우) 작업이 포함됩니다. 통계는 초기화 된 0이며 다른 값입니다. –

+0

예. 이제 이해가된다. 투표 해! –

1

당신은 Jukebox에 대한 생성자를 필요로하고 있다는 점에서 당신은 당신이 0으로 songCounter를 초기화해야한다고 생각 0

+0

예. 이제 이해가된다. 투표 해! –

1

에 카운터를 초기화해야합니다.수업의 공개 부분에서 :

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

예. 이제 이해가된다. 투표 해! –