Перегрузка инкрементатора Postfix для вложенных перечислимых типов

Мне трудно понять, как перегрузить оператор приращения постфикса для вложенного перечислимого типа класса 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);
}
}
}

0

Решение

Проблема в том, что вы не можете использовать член
оператор здесь. Член оператора всегда работает на классе
членом которого он является, и так как вы хотите, чтобы оператор на
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 ) // ...

В противном случае, это становится сложно.

4

Другие решения

Есть два способа перегрузки operator++,

Card::Suit operator++(int){ } //would be suit++

а также

Card::Suit& operator++() { } //would be ++suit

Вы не должны ничего передавать operator++кроме фиктивного параметра (обычно int) и обычно вы не возвращаете reference в постфиксе.

Увидеть Вот для некоторой информации.

1

По вопросам рекламы [email protected]