Почему оператор << перегрузка меняет значения моей переменной? - PullRequest
0 голосов
/ 16 февраля 2019

Я расширяю вопрос об интервью, который у меня был.Я создал класс Rectangle и создал несколько из них.Я столкнулся с проблемой при вызове деконструкторов.r1 был в порядке.R2 вызвал сбой.Поэтому я вручную вызвал деконструкторы и заметил, что на r2 происходит сбой.Я думал, может быть, это было связано с r1, когда он был удален, но это было не так.Проблема началась раньше.

Я изменяю значение точки r2 и распечатываю его.Изменение было хорошо, пока я не доберусь до кутЗначение точки изменяется при вводе моего перегруженного оператора <<.Входящая переменная rect получает мусор для точки, которая изменяет r2. </p>

Установка точки r2 и распечатка:

r2.SetPoint({ 6.0f, 1.0f }); // Move r2
std::cout << "After moving r2: " << &r2 << std::endl;

Мой перегруженный оператор:

std::ostream& operator<<(std::ostream & out, Rectangle* rect)
{
    return out << "x: " << rect->GetPoint()->x
        << " y: " << rect->GetPoint()->y
        << " width: " << rect->GetDimensions()->width
        << " height: " << rect->GetDimensions()->height;
}

Почемуr2 отличается от оператора print?

Чтобы увидеть весь мой код, см. мой репозиторий .(Пожалуйста, не стесняйтесь давать мне советы по моему коду и стандартам)

Редактировать: Я думаю, что это в моих конструкторах.Я удаляю две строки и все равно получаю ошибку.Посмотрев на мои конструкторы, значения вначале хороши, затем на следующей строке они выходят из строя.

1 Ответ

0 голосов
/ 16 февраля 2019

В заявлении на печать нет ничего плохого.Фактическая проблема возникает из-за того, как вы определили функцию SetPoint.

r2.SetPoint({ 6.0f, 1.0f });

Когда вы сделаете это, будет вызвана следующая функция.

void Rectangle::SetPoint(Point2D _point)
{
    this->point = &_point;
}

Обратите внимание, что этопередано значение .Если вы внимательно посмотрите, вы узнаете, что это приведет к неопределенному поведению.Зачем?Учтите это:

void Rectangle::SetPoint(Point2D _point)
{
    this->point = &_point; // this->point points to _point object.
} // _point dies here. So, accessing this->point will lead to UB.

Предложения :

1) Деструкторы не должны вызываться явно.Вы сделали это в main.cpp.Как только объект выходит из области видимости, деструктор вызывается автоматически.

2) Ваш код имеет утечку памяти.

Point2D* point = new Point2D;
Dimensions* dimensions = new Dimensions;

Если я вызываю SetPoint() и SetDimensions(), указатель надинамически выделенная память будет потеряна.

3) Определите геттеры как const функции.

4) Избегайте мелкого копирования в вашем сценарии.Это создаст проблемы, которые будет сложнее отследить.

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