所以我写了一个类,它包含了两个对象的引用,像这样。
private:
Poly *p1, *p2;
然后我像这样构造这个类
rati::rati() : p1(new Poly()), p2(new Poly()) {
(*p2)[0] = 1;
}
rati::rat(Poly &p1, Poly &p2) : p1(&p1), p2(&p2) {
}
然后我重载了 <<
操作符,用于像这样的打印(当然,作为一个友情函数)。
using std::ostream;
ostream &operator<<(ostream &stream, rat &r) {
return stream << *(r.p1) << "--------------------------" << std::endl << *(r.p2);
}
Poly
class overload <<
(并且成功地,这一次)。
当我使用默认的构造函数时,它完美地工作。 但是,如果我使用第二个构造函数,它会抛出 SIGSEGV
. 我已经调试过了,好像到了最后这一行的时候,
rat r = r1*r1+r2;
cout << r << endl;
顺利到达,这些是属性。
r.p1->d = 10
r.p2->d = 7
但是,当我输入 ostream &operator<<(ostream &stream, rat &r)
貌似 r.p1
和 r.p2
是去引用的。
r.p1->d=6683600
r.p2->d=6683536
如果有帮助,我用 g++
编译器,但它发生在 Visual Studio 2019
编译器也是。
先谢谢大家的帮助!
EDIT:
我试着重载 =
:
rat& rat::operator=(rat r) {
this->p1 = new Poly(*r.p1);
this->p2 = new Poly(*r.p2);
return *this;
}
有什么事?r.p1->d
又发生了。对了,奇怪的是 r.p1->d
定义为 const
. 我也试过了
rat& rat::operator=(rat const& r) {
this->p1 = new Poly(1);
return *this;
}
但似乎只要我声明一个新的... Poly
价值改变(或它被取消引用。
有什么想法吗?
所以我解决了这个问题......把构造函数改成了......。
rat::rat(Poly &p1, Poly &p2) : p1(new Poly(p1)), p2(new Poly(p2)) {
}
现在可以用了!
我想我不得不只是复制它,但仍然没有使用赋值操作符。