我有类堆,它代表卡片组,因此包含类卡的实例。 我重载了两个运算符,Pile :: operator + =和Pile :: operator - 。
int main()
{
Pile pile1(false); //construct an empty pile/deck
Pile pile2(true); //construct a full deck with all 52 cards
output(pile1,pile2); //just a little procedure to print both decks
pile1 += --pile2;
output(pile1,pile2);
...
操作员+ =将另一个桩作为参考,并将每个卡从参数桩移动到* this。 操作员 - 从堆中取出最顶层的牌并返回包含该牌的桩。
g ++给我的是一个编译时错误说明
error: no match for 'operator+=' in 'pile1 += Pile::operator--()()'
note: candidate is: void Pile::operator+=(Pile&)
以下是重载运算符:
void Pile::operator+=(Pile &other)
{
Node *n = other.listHead;
//add each card from other to *this
while((n = n->getNext()) != NULL)
{
this->newCardToList(other.drawCard());
}
}
Pile Pile::operator--()
{
Pile pile(false);
pile.newCardToList(this->drawCard());
return pile;
}
对我来说,看起来operator + =正试图将 - 作为参数。 我试过了pile1 + =( - pile2);但这并没有改变任何事情。
我想要(或需要在这里做)的事情是从pile2获取最顶层的卡片 并把它放到桩1。你能在这里说出什么是错的,因为我还没有想出任何东西吗?
编辑: 这里需要+ =来修改两个对象。这是必需的,因为在我们的课程中给我们这个练习项目的人要求我们这样做。虽然他的设计非常糟糕,但如果这个解决方案甚至无法实现,我也不会感到惊讶。
答案 0 :(得分:1)
operator+=
的签名和行为是错误的。算术运算符按值运行,因此您的重载也应如此。变异+=
肯定是滥用运算符重载的情况之一。
根据描述,这里发生的是对象身份和价值身份的混淆。不是将某种类型的对象从一个存储器移动到另一个存储器,而是在值方面思考通常更容易,更好地实现,并且在C ++等语言中更自然。
答案 1 :(得分:0)
operator + =无法识别,因为operator + =正确的签名是:
Pile operator+=(const Pile &other)
如果您想在里面修改other
,可以使用
Pile& mutable_other = const_cast<Pile&>(other);
和
Node *n = mutable_other.listHead;
//add each card from other to *this
while((n = n->getNext()) != NULL)
{
this->newCardToList(other.drawCard());
}
答案 2 :(得分:0)
问题是operator--
返回一个临时对象,该对象无法绑定到operator=
参数中的非const引用:
void operator+=(Pile &other) //your code
应声明为:
Pile & operator+=(const Pile &other) //solution
并在此函数的实现中编写return *this
。
答案 3 :(得分:0)
显然这种设计不起作用。我可以建议一个优秀的设计:
#include <list>
struct Card {};
class Pile
{
std::list<Card> cards;
public:
void operator>> (Pile& other)
{
other.cards.splice(other.cards.end(), cards);
}
Pile operator--(int)
{
Pile result;
result.cards.push_back(cards.back());
cards.pop_back();
return result;
}
};
int main()
{
Pile a, b;
a-->>b; //look how elegantly this expresses: take top card from a and append it to b
}