C ++ - Попытка передать объект по ссылкам приводит к разыменованию его членов - PullRequest
0 голосов
/ 29 апреля 2020

Итак, я пишу класс, который содержит ссылки на два объекта, например:

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 перегрузка класса << (и успешно, на этот раз).

Когда я использую конструктор по умолчанию, он работает отлично. Однако, если я использую второй конструктор, он выдает 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++ компилятор, но это происходит на * Компилятор 1029 *.

Заранее благодарен за любую помощь!

РЕДАКТИРОВАТЬ:

Я пытался перегрузить =:

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, значения меняются (или на него не ссылаются.

Любые мысли

1 Ответ

0 голосов
/ 29 апреля 2020

Так что я решил это .. Изменил конструктор на:

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

и теперь он работает!

Я думаю, мне пришлось просто скопировать его, но без использования оператора присваивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...