以下代码打印:
2
1
而不是
2
2
为什么我的setter没有调整值?
Vector location = camera.get_location();
camera.get_location().set_y(location.get_y() + 1);
std::cout << location.get_y() + 1 << std::endl;
std::cout << camera.get_location().get_y() << std::endl;
#ifndef CAMERA_H
#define CAMERA_H
#include "vector.h"
class Camera {
private:
Vector location;
public:
Vector get_location();
void set_location(Vector);
};
#endif
#include "camera.h"
Vector Camera::get_location() { return location; }
void Camera::set_location(Vector l) { location = l; }
答案 0 :(得分:7)
camera.get_location().set_y(location.get_y() + 1);
get_location
返回原始对象的副本。因此,set_y
会修改y
,但会修改原始位置的副本。如果您希望上述内容按预期工作,请返回引用:
Vector & get_location();
函数体将与以前相同:
Vector& Camera::get_location() { return location; }
现在它会以您期望的方式运作。
您可以将代码编写为:
Vector & location = camera.get_location(); //save the reference
location.set_y(location.get_y() + 1);
它修改了camera
的位置对象。
将上述代码与此进行比较:
Vector location = camera.get_location(); //save the copy!
location.set_y(location.get_y() + 1);
它不会修改camera
的位置对象!它会修改副本,而不是原始副本。
希望有所帮助。
答案 1 :(得分:1)
camera.get_location().set_y(location.get_y() + 1);
设置临时向量的y
而不是修改camera
的向量。
你必须这样做:
Vector new_vector = camera.get_location;
new_vector.set_y(location.get_y() + 1);
camera.set_location(new_vector)
更好的想法是避免使用getter和setter。
答案 2 :(得分:1)
您的getter Camera::get_location()
会返回Vector
个对象。这最终成为其成员变量的副本。因此,对此进行的任何更改都不会修改Vector
中包含的Camera
。
如果您希望修改此内容,则应将其更改为返回Vector&
引用。