为什么setter不改变C ++中的值?

时间:2013-01-20 08:14:54

标签: c++

以下代码打印:

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;

camera.h

#ifndef CAMERA_H
#define CAMERA_H

#include "vector.h"

class Camera {
 private:
  Vector location;
 public:
  Vector get_location();
  void set_location(Vector);
};

#endif

camera.cpp

#include "camera.h"

Vector Camera::get_location() { return location; }
void Camera::set_location(Vector l) { location = l; }

3 个答案:

答案 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&引用。