c++ - 嵌套枚举类型的后缀增量重载

标签 c++ copy-constructor enumerated-types

我很难弄清楚如何为嵌套枚举类型的 Card 重载后缀增量运算符。此外,我也很难在这门课上完成作业。我收到以下错误“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);
        }
    }
}

最佳答案

问题是你无法使用成员 运营商在这里。成员运算符总是对类进行操作 它是其中的成员,并且由于您希望它在 枚举,而不是在一个类上,它不能是成员。

如果你想让 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增加一个额外的值;例如END_SuitEND_Spot。这允许简单和安全的迭代:

for ( Suit s = SPADES; s != END_Suit; ++ s ) // ...

否则,它会变得棘手。

关于c++ - 嵌套枚举类型的后缀增量重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18211287/

相关文章:

c++ - MSVC++ 中的无限

c++ 17在编译时将具有已删除复制构造函数的类添加到std::vector

c++ - Copy Constructor C++编译错误

c++ - 在 C++ 中将函数作为参数执行

c++ - 如何在 CRTP 实现中传递基类指针

c++ - 无法更改 netbeans 的系统变量 "Path"

C++ 复制构造函数基类指针

c++ - Typedef C++ 中的枚举值

java - 无法为字段设置随机枚举