Мне трудно понять, как перегрузить оператор приращения постфикса для вложенного перечислимого типа класса Card. Кроме того, у меня также возникают трудности с получением копии задания для работы в этом классе. Я получаю следующие ошибки: «оператор ++ должен принимать один или ноль аргументов». Затем, когда я пытаюсь предоставить задание, я получаю
no match for operator= in ((deck*)->this)->Deck::deckArr = operator new
class Card {
public:
enum Suit {
SPADES,
HEARTS,
CLUBS,
DIAMONDS
};
enum Spot {
DEUCE,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE,
TEN,
JACK,
QUEEN,
KING,
ACE
};
Card();
Card(Card&);
Card(Suit&, Spot&);
~Card();
Suit& operator++(Suit&,int);
Spot& operator++(Spot&,int);
Card& operator=(const Card&);
private:
Spot _spot;
Suit _suit;
};
Card::Suit& Card::operator++(Card::Suit &s, int) {Card::Suit oldsuit = s;
s = (Card::Suit)(s+1);
return oldsuit;}
Card::Spot& Card::operator++(Card::Spot &sp, int){Card::Spot oldspot = sp;
sp = (Card::Spot)(sp+1);
return oldspot;}
Card& Card::operator=(const Card &c){_spot = c._spot; _suit = c._suit; return *this;}#include "card.h"
class Deck {
public:
Deck();
Deck(Deck&);
~Deck();
void createDeck();
void shuffleDeck(int);
private:
static const int DECK_SIZE = 52;
Card deckArr[DECK_SIZE];
};
void Deck::createDeck(){
int x = 0;
for(Card::Suit s = Card::SPADES; s <= Card::HEARTS; s++){
for(Card::Spot n = Card::DEUCE; n <= Card::ACE; n++, x++){
deckArr[x] = new Card(s, n);
}
}
}
Проблема в том, что вы не можете использовать член
оператор здесь. Член оператора всегда работает на классе
членом которого он является, и так как вы хотите, чтобы оператор на
enum, а не в классе, он не может быть членом.
Если вы хотите, чтобы ADL нашел его, вам нужно сделать его другом, в
Чтобы объявить (и, возможно, определить это) внутри класса:
friend Suit& operator++( Suit& s )
{
s = static_cast<Suit>( s + 1 );
return s;
}
friend Suit operator++( Suit& s, int )
{
Suit result( s );
s ++;
return result;
}
и то же самое для Spot.
Вам также нужно будет решить, что делать, когда вы итерируете дальше
конец. Кастинг s + 1
обратно к типу перечисления не определено
поведение, по крайней мере, в случае Suit
, Общее соглашение
добавить дополнительное значение для конца в конце; например END_Suit
а также END_Spot
, Это обеспечивает простую и безопасную итерацию:
for ( Suit s = SPADES; s != END_Suit; ++ s ) // ...
В противном случае, это становится сложно.
Есть два способа перегрузки operator++
,
Card::Suit operator++(int){ } //would be suit++
а также
Card::Suit& operator++() { } //would be ++suit
Вы не должны ничего передавать operator++
кроме фиктивного параметра (обычно int
) и обычно вы не возвращаете reference
в постфиксе.
Увидеть Вот для некоторой информации.