运算符重载( - )将变量设置为0

时间:2014-12-11 01:21:17

标签: c++

当我打电话给r--;我的对象将值重置为0.任何想法?

class MyClass : Superclass {
private:
    int length;
    int width;

public:
    MyClass() {
        length = 0;
        width = 0;
    }

    MyClass (int x, int y):Superclass(x/2,y/2){
        length = x;
        width = y;

    }

    MyClass operator--(int) {
        MyClass temp = *this;
        temp.length --;
        temp.width --;
        return temp;
    };
};

创建并尝试课程:

MyClass *r = new MyClass(2,3);
r--; // now length and width = 0 (should be 1,2)

1 个答案:

答案 0 :(得分:6)

首先,操作符不会减少它所调用的对象,而是它将返回的副本。它应该单独留下(返回先前的值)并递减对象:

MyClass temp = *this;
this->length--;   // this-> is optional
this->width--;
return temp;

其次,r是一个指针。 r--递减指针,而不是它指向的对象,使其指向无效的内存位置。之后取消引用它会产生不确定的行为。

我不知道你为什么在这里使用new;你几乎肯定只想要一个变量:

MyClass r(2,3);
r--;   // should behave as expected.

如果由于某种原因确实需要指针,则必须取消引用才能获取对象:

(*r)--;

并且不要忘记在完成对象后删除它。而不是之前。