这是我的班级:
class B : public A{
private:
double r;
public:
B(){};
B(double x_, double y_, double r_){
x1 = x_; y1 = y_; r = r_;
};
~B(){};
B operator+(const B& other)
{
double result_r = r + other.r;
return B(x1, y1, result_r);
}
B operator*(const B& other)
{
double result_r = this->r * other.r;
return B(x1, y1, result_r);
}
int operator<(const B& other){
if (this->r<other.r)return 1; else return 0;
}
int operator>(const B& other){
if (this->r>other.r)return 1; else return 0;
}
};
A类是抽象的,这就是我如何声明B:
A*a = new B(10, 10, 10);
A*b = new B(20, 20, 20);
(a<b)
之类的内容确实有效,A*c=a+b;
不起作用。
如果我不使用指向A和&lt;的指针,它确实有用。有int作为类型,所以我假设它的东西与重载返回的类型,我jsut无法弄清楚如何做到这一点,还有办法吗?
答案 0 :(得分:1)
你说:
虽然
(a<b
之类的内容确实有用,但A*c=a+b;
不起作用。
(a<b)
有效,因为编译器知道如何比较两个指针。它并不意味着它会解决bool B::operator<(const B&)
。
A*c=a+b;
不起作用,因为编译器现在不会添加两个B*
个对象。
要使用已定义的运算符重载函数,必须使用B
类型的对象,而不是指向B
类型对象的指针。
您可以使用以下方法显式调用操作符函数:
B* b1Ptr = new B;
B* b2Ptr = new B;
B b3 = b1Ptr->operator+(*b2Ptr);
但那不是你用
获得的B b3 = b1Ptr + b2Ptr;
您也可以使用:
B b3 = *b1Ptr + *b2Ptr;
答案 1 :(得分:0)
A* c
声明一个指针。 a+b
的结果是B
类型。因此,编译器会告诉您无法将类型为B
的对象分配给指针。你为什么需要指针?
只使用A c = a + b
。
如果你真的想使用指针,请执行
A tmp = a + b;
A* c = &tmp;
或直接
A* c = new B(a+b);