操作数无效 - 如何修复此短代码?

时间:2011-07-26 21:21:26

标签: c++

我应该分析一些片段并找到错误并修复它们。我得到了所有这些,只是这个问题:

class B {
public:
    int i;
    B(int i):i(i) {
    }
    B operator+(B& other) {
        B result(i+other.i);
        return result;
    }
};

int main(int argc, char *argv[]) {

    B* b0 = new B(100);
    B* b1 = new B(300);
    B* b2 = b1+b2; //invalid operands of types ‘B*’ and ‘B*’ to binary ‘operator+’
}

不明白这个问题,也不知道如何解决这个问题。有人可以向我解释这个问题吗?

3 个答案:

答案 0 :(得分:4)

b1和b2是指针(但我想你想添加b0和b1)。您的运营商可能会被*b0 + *b1调用,但结果是B,而不是B*。您还可能需要设置运算符方法const,以及other参数。

答案 1 :(得分:2)

您需要取消引用指针,然后使用该值构造一个新对象:

B * b2 = new B(*b0 + *b1);
// don't forget to clean up b0, b1 and b2!

然而,只是根本不这样做。您可能不需要动态分配这些变量,因此只需自动分配它们:

B b0(100);
B b1(300);
B b2 = b0 + b1;

答案 2 :(得分:-1)

您正在使用指向对象的指针(即对象的地址),而不是对象本身。

我认为你想写的是:

B b(100);
B b1(300);
B b2 = b1+b2;

您的代码可以修改为编译:

B* b0 = new B(100);
B* b1 = new B(300);
B* b2 = &(*b1+*b2);

但您现在处于非常危险区域。加法运算符在堆栈上创建了一个变量,并且您已获取该变量的地址。但是,下次使用堆栈时(例如调用另一个函数),变量将被删除。

这显示了C ++可以轻易陷入的陷阱!

只是绝对清楚你不应该这样做