int / counter的奇怪行为

时间:2012-01-14 20:57:58

标签: c++ class

我正在尝试将一些歌曲添加到课堂内的矢量中。我正在存储的值之一是代表歌曲的int。它本质上是一个反击。我添加的第一首歌应该是值1,第二首歌应该是2,依此类推。但它正在获得其他奇怪的价值,如大随机数(正面和负面)。我无法绕过我做错的事。这是代码:

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

5 个答案:

答案 0 :(得分:4)

您没有在构造函数中初始化songCounter

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

如果你没有初始化它,那么它可能有任何随机值,并使你的程序处于未定义状态。

使用单位化变量时要小心,这通常会导致未定义的行为,并且您的程序就是一个很好的例子。

<击> 此外,我不确定您的设计,但如果您想将其用作计数器,它可能应该是static成员,该计数器会维护Song类的所有对象的状态。

在创建Song对象时,您必须将其显式设置为正确的值。

好吧它是JukeBox而不是Song类的计数器,所以它仍然可以成为会员。

答案 1 :(得分:1)

您没有初始化变量songCounter

将以下内容添加到Jukebox的类定义中:

Jukebox(): songCounter(0) {}

答案 2 :(得分:1)

你在哪里初始化songCounter?在C ++中,默认情况下基元不会初始化为零。你需要添加

: songCounter(0)

到你的构造函数。

答案 3 :(得分:1)

你需要Jukebox的构造函数,并且你需要将计数器初始化为0。

答案 4 :(得分:1)

我认为你应该将songCounter初始化为0.在课堂的公共部分:

public Jukebox() : songCounter(0) {}