我很难弄清楚如何为嵌套枚举类型的类卡重载后缀增量运算符。此外,我也很难获得复制作业来为这门课程工作。我收到以下错误“operator ++必须带一个或零个参数。”然后,当我尝试提供作业时,我得到了
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 :(得分:4)
问题是你无法使用会员 算子在这里。成员运算符始终对该类进行操作 它是一个成员,因为你想要它的运营商 枚举,而不是一个类,它不能成为一个成员。
如果你想让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 ) // ...
否则,它会变得棘手。
答案 1 :(得分:1)
有两种方法可以重载operator++
,
Card::Suit operator++(int){ } //would be suit++
和
Card::Suit& operator++() { } //would be ++suit
除了虚拟参数(通常为operator++
)之外,您不能将任何内容传递给int
,并且通常您不会在后缀中传回reference
。
有关详情,请参阅here。