我试图将这些卡在矢量中洗牌
I am trying to shuffle these cards in a vector
int main() {
std::vector<Card> listOfCards;
for (int j = 0; j < 52; j++) {
Card card(j / 13, j % 13);
listOfCards.push_back(card);
}
std::random_shuffle(listOfCards.begin(),listOfCards.end());
for(int i = 0; i < listOfCards.size(); i++)
std::cout << listOfCards[i].display() << std::endl;
我得到的结果与向量中的结果一样。我尝试使用整数随机洗牌效果很好。当我洗牌非原始物体时,我需要什么特别的东西吗?
This is my Card class
class Card{
private:
int suit,rank,value;
public:
Card();
Card(int suit,int rank, int value);
Card(int suit,int rank);
显示方法
std::string Card::display(){
std::string suits[] = {"Club","Spade","Heart","Diamond"};
std::string ranks[] =
{"Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"};
return suits[this->suit] + "t" + ranks[this->rank];}
类的构造函数
Card::Card(int suit, int rank) {
this->suit = suit;
this->rank = rank;
this->value = 0;
}
这是我的两个运算符函数。他们正确实现了吗?
Card &Card::operator=(const Card &card) {
Card myCard;
myCard.suit = card.suit;
myCard.value = card.value;
myCard.rank = card.rank;
return myCard;
}
bool Card::operator<(const Card card) {
return this->getRank() < card.getRank();
}
分配运算符未正确实现。在这种情况下,如果您摆脱了定义,则代码可以正常工作,但是我将解释一下以后的参考。
。分配运算符的返回值通常是对刚分配给对象的副本的引用(因此,如果您编写x =(a = b(,则x将是对具有具有的新对象的引用分配后A的值以及A,B和X是具有相同值的三个不同对象(。返回值通常不使用。
如果您编写自己的副本分配运算符,只要它具有正确的类型,就可以使其返回所需的任何对象。但是,平等符号左侧的对象不会承担返回对象的值。
所以,要解释您的副本分配操作员在做什么,让我们看看会发生什么:
Card &Card::operator=(const Card &card) {
Card myCard;
myCard.suit = card.suit;
myCard.value = card.value;
myCard.rank = card.rank;
return myCard;
}
它采用称为卡的卡参考对象。它创建一个名为MyCard的类型卡的局部变量。然后,它将每个数据成员从输入卡复制到本地变量mycard。然后,它通过参考返回本地变量。因此,如果我们有
Card A(1,1);
Card B(2,2);
Card x(3,3);
x = (A=B);
在最后一行中,在括号中,用参数B调用A的分配运算符。在此内,创建了局部变量并给定值(2,2(。这将返回并传递给X的分配运营商。在那里创建一个局部变量并分配了(2,2(的值,然后在不使用时被破坏。最后,什么都没有改变。
您需要做的是:
Card &Card::operator=(const Card &card) {
suit = card.suit;
value = card.value;
rank = card.rank;
return *this;
}
在此处,在功能内部,变量套件是指调用分配运算符的对象的"诉讼"成员,该对象是平等符号左侧的对象。因此,如果您写
A=B
然后,A分配运算符被调用,并修改了A.Suit值。
另外,让我们看一下您的构造函数:
Card::Card(int suit, int rank) {
this->suit = suit;
this->rank = rank;
this->value = 0;
}
写这句话的更标准的方法就是这样:
Card::Card(int _suit, int _rank) {
suit = _suit;
rank = _rank;
value = 0;
}
或:
Card::Card(int _suit, int _rank) : suit(_suit), rank(_rank), value(0)
{}
因此,您可以按名称区分参数和数据成员。行为将相同,但这更清晰,更短。
相关文章:
- 没有找到相关文章