我在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();
}
答案 0 :(得分:3)
假设您希望在修改{{1}中的向量中的元素时修改Point3D
函数中的p1
对象p4
至main
}对象,那么他们就不会。
谐振在您执行的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;