C++ - 试图通过引用来传递对象,会使其成员失去引用。

问题描述 投票:0回答:1

所以我写了一个类,它包含了两个对象的引用,像这样。

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.p1r.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价值改变(或它被取消引用。

有什么想法吗?

c++ class pointers reference
1个回答
0
投票

所以我解决了这个问题......把构造函数改成了......。

rat::rat(Poly &p1, Poly &p2) : p1(new Poly(p1)), p2(new Poly(p2)) {
}

现在可以用了!

我想我不得不只是复制它,但仍然没有使用赋值操作符。

© www.soinside.com 2019 - 2024. All rights reserved.