C++ 嵌套枚举类型的后缀递增重载

C++ 嵌套枚举类型的后缀递增重载,c++,copy-constructor,enumerated-types,C++,Copy Constructor,Enumerated Types,我很难理解如何为嵌套枚举类型的类卡重载后缀增量运算符。此外,我也很难得到这门课的复印作业。我得到以下错误“运算符++必须接受一个或零个参数”。然后,当我尝试提供赋值时,我得到 no match for operator= in ((deck*)->this)->Deck::deckArr = operator new 类卡{ 公众: 枚举诉讼{ 黑桃, 心, 俱乐部, 钻石 }; 枚举点{ 见鬼, 三,, 四,, 五,, 六,, 七,, 八,, 九,, 十,, 杰克, 女王,

我很难理解如何为嵌套枚举类型的类卡重载后缀增量运算符。此外,我也很难得到这门课的复印作业。我得到以下错误“运算符++必须接受一个或零个参数”。然后,当我尝试提供赋值时,我得到

no match for operator= in ((deck*)->this)->Deck::deckArr = operator new 

类卡{
公众:
枚举诉讼{
黑桃,
心,
俱乐部,
钻石
};
枚举点{
见鬼,
三,,
四,,
五,,
六,,
七,,
八,,
九,,
十,,
杰克,
女王,
国王,
王牌
};
卡片();
卡片(卡片&);
卡片(套装、现货和);
~Card();
西服和操作员++(西服和内服);
Spot&operator++(Spot&int);
卡和操作员=(常量卡和);
私人:
斑点(Spot);;
西服;
};
Card::Suit&Card::operator++(Card::Suit&s,int){Card::Suit oldsuit=s;
s=(卡片::套装)(s+1);
返回旧西装;}
Card::Spot&Card::operator++(Card::Spot&sp,int){Card::Spot oldspot=sp;
sp=(卡片::现货)(sp+1);
返回oldspot;}
Card&Card::operator=(const Card&c){{u spot=c.\u spot;\u suit=c.\u suit;返回*this;}
#包括“card.h”
甲板{
公众:
甲板();
甲板(甲板&);
~Deck();
void createDeck();
无效随机分组(int);
私人:
甲板上的静力常数=52;
卡片卡片卡片[卡片大小];
};
void Deck::createDeck(){
int x=0;

对于(Card::Suit s=Card::SPADES;s有两种方法可以重载操作符++

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

除了伪参数(通常是
int
)外,您不能将任何内容传递给
运算符+++
,并且通常不能在后缀中传回
引用


有关某些信息,请参阅。

有两种方法可以重载
运算符+++

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

除了伪参数(通常是
int
)外,您不能将任何内容传递给
运算符+++
,并且通常不能在后缀中传回
引用


有关某些信息,请参阅。

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

如果你想让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;
}

否则,它会变得棘手。

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

如果你想让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;
}

否则,它会变得棘手。

你的
卡的构造函数在哪里?而且,标题似乎与错误消息无关。为什么你会得到“deckArr[x]=新卡(s,n);”接近尾声?为什么是新的?关于您的实现,您不想返回对
oldsuit
oldspot
的引用。您提出了两个独立的问题。关于运算符重载的主要问题有一个很好的答案;关于
运算符新的
的第二个问题是因为您试图分配给
从指向动态分配对象的指针中选择Card
对象。您希望
deckArr[x]=Card(s,n);
改为从临时对象分配。您的
Card
构造函数在哪里?此外,标题似乎与错误消息无关。您为什么得到“deckArr[x]=新卡(s,n);”接近尾声?为什么是新的?关于您的实现,您不想返回对
oldsuit
oldspot
的引用。您提出了两个独立的问题。关于运算符重载的主要问题有一个很好的答案;关于
运算符新的
的第二个问题是因为您试图分配给
卡片
对象,从指向动态分配对象的指针开始。您希望
deckArr[x]=卡片(s,n);
改为从临时对象赋值。这是如何将运算符重载为类成员;但对于枚举,我们需要将它们重载为非成员。这是如何将运算符重载为类成员;但是对于枚举,我们需要将它们重载为非成员。
for ( Suit s = SPADES; s != END_Suit; ++ s ) // ...