在向量内部更改变量的值不会在向量外部更改其值

时间:2020-02-01 22:21:09

标签: c++ vector

我在Figure3D类中有一个Point3D类对象的向量。更改矢量内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 个答案:

答案 0 :(得分:3)

假设您希望在修改{{1}中的向量中的元素时修改Point3D函数中的p1对象p4main }对象,那么他们就不会。

谐振在您执行的f1函数中

AddPoint

向量存储不同的对象,而不存储指针或引用。结合使用derefernece运算符,可以将对象的副本存储在向量内。修改副本不会修改原始副本。

答案 1 :(得分:0)

您的import javax.swing.*; import java.awt.*; public class GUI{ public static void main(String[] args) { SwingUtilities.invokeLater(GUI::startUp); } private static void startUp() { JFrame frame = new JFrame("AoA"); frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(1020,760); frame.setBackground(Color.LIGHT_GRAY); frame.setResizable(false); frame.setLayout(new FlowLayout()); JTextArea jta = new JTextArea(30,60); jta.setEditable(false); jta.setBackground(Color.WHITE); frame.add(new JScrollPane(jta)); JTextField jta2 = new JTextField(); jta2.setPreferredSize(new Dimension(200,70)); jta2.setHorizontalAlignment((int) JTextField.CENTER_ALIGNMENT); frame.add(new JScrollPane(jta2)); frame.setVisible(true); jta.append("Test"); } } 函数错误。您将指针作为参数传递,但是随后取消指针的引用并将AddPoint对象的副本存储到Point3D中。因此,应该是:

std::vector

代替

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

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

代替

std::vector<Point3D*> f;