int/计数器的奇怪行为

Strange behavior for int / counter

本文关键字:计数器 int      更新时间:2023-10-16

我正在尝试将一些歌曲添加到类内的向量中。我存储的一个值是代表歌曲的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;
}

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

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

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

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

此外,我不确定您的设计,但如果您想将其用作计数器,它可能应该是static成员,用于维护Song类的所有对象的状态
或者
在创建Song对象时,必须将其显式设置为适当的值

好的,这是JukeBox的计数器,而不是Song类,所以作为成员还是可以的。

您没有初始化变量songCounter

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

Jukebox(): songCounter(0) {}

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

我认为应该将songCounter初始化为0。在类的公共部分:

public Jukebox() : songCounter(0) {}

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

: songCounter(0)

到您的构造函数。