我对C ++很陌生,我的编程任务要求改组一副牌。到目前为止,我已经能够创建一个矢量并将所有52张卡添加到卡座中并显示它们。但是,当我尝试交换元素时,我会收到错误。请帮帮我!
卡头文件:
#include <string>
using namespace std;
#ifndef CARD_H
#define CARD_H
class Card {
public:
Card();
Card(int f, int s);
string toString();
const int numFace = 13;
const int numSuit = 4;
const static string faces[];
const static string suits[];
void setFace(int face);
void setSuit(int suit);
void display();
private:
int face, suit;
};
#endif
卡片c ++文件:
#include <iostream>
#include <string>
#include <stdexcept>
#include "Card.h"
using namespace std;
const string Card::faces[] = {"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
const string Card::suits[] = {"Diamonds", "Clubs", "Hearts", "Spades"};
Card::Card(){
setFace(1);
setSuit(1);
}
Card::Card(int face, int suit){
setFace(face);
setSuit(suit);
}
void Card::display(){
cout << faces[face-1] + " of " + suits[suit-1] << endl;
}
void Card::setFace(int face){
if(face >= 1 && face <= 13){
this->face = face;
} else {
throw invalid_argument("face must be 1-13!");
}
}
void Card::setSuit(int suit){
if(suit >= 1 && suit <= 4){
this->suit = suit;
} else {
throw invalid_argument("suit must be 1-4!");
}
}
string Card::toString(){
return faces[face-1] + " of " + suits[suit-1] + "\n";
}
DeckOfCards头文件:
#include <string>
#include <vector>
#include "Card.h"
using namespace std;
#ifndef DECKOFCARDS_H
#define DECKOFCARDS_H
class DeckOfCards {
public:
const static int totalCards;
DeckOfCards();
void shuffle();
string dealCard();
bool moreCards();
vector< Card > deck;
void initCards();
void display();
private:
int currentCard;
};
#endif
DeckOfCard cpp文件:
#include <iostream>
#include <stdexcept>
#include <algorithm>
#include <vector>
#include <ctime>
#include "Card.h"
#include "DeckOfCards.h"
#include <cstdlib>
#include <ctime>
#include <utility>
using namespace std;
DeckOfCards::DeckOfCards(){
vector<Card> deck;
initCards();
}
void DeckOfCards::initCards(){
const int numCardInSuit = 13;
for(int i = 1 ; i <= numCardInSuit; i++){
deck.push_back(Card(i,1)); //push diamonds
deck.push_back(Card(i,2)); //push clubs
deck.push_back(Card(i,3)); //push hearts
deck.push_back(Card(i,4)); //push spades
}
}
void DeckOfCards::shuffle(){
srand( static_cast<unsigned int>( time(0)) );
int randomNum = 0;
Card card;
for(int i = 0; i < deck.size()-1; i++){
cout << "entered swap" << endl;
randomNum = rand() % 52;
swap(deck[i], deck[randomNum]);
/* vector< int > vect;
vect.push_back(99); Creating a vector and
vect.push_back(1); swapping this way works!
for(int ele : vect){
cout << ele << endl;
}
swap(vect[0], vect[1]);
cout << "Swapped" << endl;
for(int ele : vect){
cout << ele << endl;
}
*/
/*
card = deck[i]
deck[i] = deck[randomNum];
deck[randomNum] = card;
*/
cout << "finished swap" << endl;
}
}
string DeckOfCards::dealCard(){
return deck[1].toString();
}
bool DeckOfCards::moreCards(){
return true;
}
void DeckOfCards::display(){
for(int i = 0; i < deck.size(); i++){
cout << deck[i].toString();
}
}
主要是:
#include <iostream>
#include "DeckOfCards.h"
using namespace std;
int main()
{
DeckOfCards myDeck;
myDeck.display();
myDeck.shuffle();
return 0;
}
编译程序时出错:
In file included from /usr/include/c++/5/bits/stl_pair.h:59:0,
from /usr/include/c++/5/bits/stl_algobase.h:64,
from /usr/include/c++/5/bits/char_traits.h:39,
from /usr/include/c++/5/ios:40,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iostream:39,
from DeckOfCards.cpp:1:
/usr/include/c++/5/bits/move.h: In instantiation of 'void std::swap(_Tp&, _Tp&) [with _Tp = Card]':
<span class="error_line" onclick="ide.gotoLine('DeckOfCards.cpp',40)">DeckOfCards.cpp:40:32</span>: required from here
/usr/include/c++/5/bits/move.h:186:11: error: use of deleted function 'Card& Card::operator=(Card&&)'
__a = _GLIBCXX_MOVE(__b);
^
In file included from DeckOfCards.cpp:6:0:
Card.h:7:7: note: 'Card& Card::operator=(Card&&)' is implicitly deleted because the default definition would be ill-formed:
class Card {
^
Card.h:7:7: error: non-static const member 'const int Card::numFace', can't use default assignment operator
Card.h:7:7: error: non-static const member 'const int Card::numSuit', can't use default assignment operator
In file included from /usr/include/c++/5/bits/stl_pair.h:59:0,
from /usr/include/c++/5/bits/stl_algobase.h:64,
from /usr/include/c++/5/bits/char_traits.h:39,
from /usr/include/c++/5/ios:40,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iostream:39,
from DeckOfCards.cpp:1:
/usr/include/c++/5/bits/move.h:187:11: error: use of deleted function 'Card& Card::operator=(Card&&)'
__b = _GLIBCXX_MOVE(__tmp);
^
很抱歉这篇长篇文章我只想把所有内容都放进去,以方便任何人提供帮助!随意批评我的代码!非常感谢!
编译程序答案 0 :(得分:0)
从错误中选择一些关键行
In instantiation of 'void std::swap(_Tp&, _Tp&) [with _Tp = Card]':
use of deleted function 'Card& Card::operator=(Card&&)'
'Card& Card::operator=(Card&&)' is implicitly deleted because the default definition would be ill-formed:
non-static const member 'const int Card::numFace', can't use default assignment operator
您正在尝试将std::swap
与卡片一起使用
在内部会尝试使用operator=
,意思是
Cards a, b;
a = b; // Here we are using the operator=
因此,错误消息继续说,使用已删除的函数operator=
它被隐式删除,因为默认定义是不正确的
由于您的班级中const int
无法分配,因此形成不良。
const int c = 5;
c = 10; // This is illegal for a const
错误消息还提示非静态const成员...
您可以通过多种方式解决此问题,const int
static
似乎是您的理想选择。