我应该分析一些片段并找到错误并修复它们。我得到了所有这些,只是这个问题:
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+’
}
不明白这个问题,也不知道如何解决这个问题。有人可以向我解释这个问题吗?
答案 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 ++可以轻易陷入的陷阱!
只是绝对清楚你不应该这样做。