重载运算符尝试将另一个重载运算符作为参数

时间:2011-12-03 15:13:53

标签: c++ operator-overloading

我有类堆,它代表卡片组,因此包含类卡的实例。 我重载了两个运算符,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。你能在这里说出什么是错的,因为我还没有想出任何东西吗?

编辑: 这里需要+ =来修改两个对象。这是必需的,因为在我们的课程中给我们这个练习项目的人要求我们这样做。虽然他的设计非常糟糕,但如果这个解决方案甚至无法实现,我也不会感到惊讶。

4 个答案:

答案 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
}