我一直收到错误:
0x5a6fca58处的未处理异常 Gofish.exe中的(msvcr100d.dll): 0xC0000005:访问冲突写入 位置0x0ff3b113。
我正在尝试运行的代码是:
#include <iostream>
#include <string>
#include<Array>
using namespace std;
class Card{
string suit;
int rank;
public:
Card(int a, string b){
rank=a;
suit=b;
}
Card(){}
string getSuit(){
return suit;
}
int getRank(){
return rank;
}
};
class Deck{
Card deck [52];
public:
Deck(){
for(int i=1; i<=13; i++){
deck [i]=Card(i, "spades");
deck [i*2]=Card(i, "hearts");
deck [i*3]=Card(i, "diamonds");
deck [i*4]=Card(i, "clubs");
}
}
void list(){
for(int i=1; i<=52; i++){
cout << deck [i].getRank() << " of " << deck [i].getSuit() << endl;
}
}
};
int main(){
Deck deck=Deck();
deck.list();
system("pause");
return 0;
}
我正在使用的编译器是Microsoft Visual C ++ 2010 Express,如果这可能会影响任何内容。
答案 0 :(得分:6)
因为数组是基于零的。你的数组中最高的索引是51但是你试图访问52.此外,在你的实现中,第一张卡在索引0处永远不会被访问。
deck [i*4-1]=Card(i, "clubs");
答案 1 :(得分:3)
在大小为deck
的数组52
中,您尝试使用无效的索引52
。
您可以将for
循环更改为:
for(int i=0; i<52; i+=4){
deck [i] = Card(i, "spades");
deck [i+1] = Card(i, "hearts");
deck [i+2] = Card(i, "diamonds");
deck [i+3] = Card(i, "clubs");
}
答案 2 :(得分:0)
这看起来像是家庭作业,所以我会给你一些提示:
检查你的for循环逻辑。
请记住,数组中的第一个条目是0而不是1。
答案 3 :(得分:0)
除了数组索引溢出问题。这可能有问题:
int main(){
Deck deck=Deck();
// ...
}
没有必要:您只需编写Deck deck;
即可。但是这样,如果您的编译器没有执行任何优化,您最终可能会尝试使用默认的assingment运算符复制Deck
对象,该运算符执行成员复制。因此,将尝试复制Card
固定大小的数组,并将一个固定大小的数组复制到另一个不会正常工作。