Изменение значения переменной внутри вектора не меняет ее значения вне вектора - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть вектор объектов класса Point3D внутри класса Figure3D. Функция, которая изменяет координаты объекта Point3D внутри вектора, не меняет координаты объекта Point3D, находящегося вне вектора.

Использование функции Figure3D :: Pos () Я вижу, что координаты изменились внутри вектора после использования функции Figure3D :: Move (), но с помощью Point3D :: full_pos () Я вижу, что объект Point3D по-прежнему имеет начальные координаты.

#include <vector>
#include <iostream>
#include <math.h>

#define PI acos(-1)

class Point3D {
public:
    Point3D()
    {
        X = 0;
        Y = 0;
        Z = 0;
    }
    Point3D(double a, double b, double c) {
        X = a;
        Y = b;
        Z = c;
    };

    void full_pos() {
        std::cout << "Coordinates of the point are: X = " << X << " Y = " << Y << " Z = " << Z << std::endl;
    }
    void Move(double dx, double dy, double dz) {
        X += dx;
        Y += dy;
        Z += dz;
    }

private:
    double X, Y, Z;
};

class Figure3D :public Point3D {
public:
    Figure3D() {
        f.reserve(10);
    }

    void AddPoint(Point3D *p) {
        f.push_back(*p);
    }

    void Move(double x, double y, double z) {
        for (auto it = f.begin(); it != f.end(); it++) {
            it->Move(x, y, z);
        }
    }
    void Pos() {
        int i = 0;
        for (auto it = f.begin(); it != f.end(); it++) {
            cout << "Position of point " << i << "  X: " << it->posX() << " Y: " << it->posY() << " Z: " << it->posZ() << std::endl;
            i++;
        }
    }
private:
    std::vector<Point3D> f;
};

int main() {
    Point3D p1(1, 2, 3), p2(2, 2, 2), p3(5, 4, 7), p4(4, 9, 0);
    Figure3D f1;

    f1.AddPoint(&p1);
    f1.AddPoint(&p2);
    f1.AddPoint(&p3);
    f1.AddPoint(&p4);

    f1.Pos();
    p1.full_pos();
    f1.Move(10, 10, 10);
    f1.Pos();
    p1.full_pos();

} 

Ответы [ 2 ]

3 голосов
/ 02 февраля 2020

Предполагая, что вы ожидаете, что объекты Point3D от p1 до p4 в функции main будут изменены при изменении элементов вектора в объекте f1, тогда они не будут.

Резонанс находится в функции AddPoint, где вы выполняете

f.push_back(*p);

. В векторе хранятся различные объекты, а не указатели или ссылки. Это вместе с использованием вами оператора разыменования заставляет вас хранить копию объекта внутри вектора. Изменение копии не приведет к изменению оригинала.

0 голосов
/ 02 февраля 2020

Ваша AddPoint функция неверна. Вы передаете указатель в качестве аргумента, но затем разыменовываете указатель и сохраняете копии объекта Point3D в свой std::vector. Следовательно, оно должно быть:

void AddPoint(Point3D *p) {
    f.push_back(p);
}

вместо

void AddPoint(Point3D *p) {
    f.push_back(*p);
}

и

std::vector<Point3D*> f;

вместо

std::vector<Point3D> f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...