int/计数器的奇怪行为
Strange behavior for int / counter
我正在尝试将一些歌曲添加到类内的向量中。我存储的一个值是代表歌曲的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)
到您的构造函数。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 循环在计数器中不起作用
- 长 长 int 不要 长 int 好
- 计数器 int 在不询问的情况下递增
- map<int,int> 计数器; counter[nums[i]]++;
- int/计数器的奇怪行为