operator +无法识别类型

时间:2016-05-26 13:58:55

标签: c++

我面临一个奇怪的问题。我有一堆文字,包含整数,双打,全押等。我已经定义了operator +,可以做Double + Integer,Integer + Integer等。 但是当我这样做时:

Litteral& pop1 = stack.top();
stack.pop();
Litteral& pop2 = stack.top();
stack.pop();
Litteral& toAdd = (*pop1.clone() + *pop2.clone());

我明白了:

  

与'operator +'不匹配(操作数类型为'Litteral'和'Litteral')            Litteral&安培; toAdd =(* pop1.clone()+ * pop2.clone());

即使使用clone(),也无法识别类型。我的操作员+是虚拟的。 以下是我定义operator +的方法:

class Integer;

class Litteral {
public:
    virtual QString toString () const = 0;
    virtual int getValue() const = 0;
    virtual Litteral * clone() const = 0;
    virtual Litteral& operator+(const Integer& l) = 0;
};
class Integer: public Litteral {
    friend class LitteralManager;
    int value;
public:
    ...
    virtual Integer& operator+(const Integer& e);
    Integer* clone() const;
};

这是clone(),因为我使用工厂设计模式:

Integer* Integer::clone() const {
    return new Integer(*this);
}

有没有人有线索?谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

这一行有很多问题:

Litteral& toAdd = (*pop1.clone() + *pop2.clone());
  • 你正在立刻泄漏记忆。 clone()分配内存,你没有抓住任何地方的指针,所以你不能delete它。
  • operator+应该创建一个新对象,让它返回一个引用 - 但是它会返回一个引用?这表明它正在修改左手参数,如果a + b修改a ...
  • ,这对用户来说会非常令人惊讶。
  • 您的operator+被定义为采用Integer const&的右手参数。但*pop2.clone()Litteral - 没有从基类到派生类的标准转换(毕竟,它可能是非整数文字,对吧?)。这就是operator+无法匹配的原因。您必须更改功能的签名。这是你问题的字面(ha!)答案。
  • 单词literal只有一个。

这也很糟糕:

Litteral& pop1 = stack.top();
stack.pop();

你持有一个悬空引用 - 位于堆栈顶部的文字被pop()破坏。 pop1的任何后续使用都将是未定义的行为。