1

以下代码打印:

2
1

代替

2
2

为什么我的设置器没有调整值?

主要的

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;

相机.h

#ifndef CAMERA_H
#define CAMERA_H

#include "vector.h"

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

#endif

相机.cpp

#include "camera.h"

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

3 回答 3

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的位置对象!它修改副本,而不是原件。

希望有帮助。

于 2013-01-20T08:17:56.443 回答
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。

于 2013-01-20T08:18:50.020 回答
1

您的吸气剂Camera::get_location()返回一个Vector对象。这最终成为其成员变量的副本。Vector因此,对此的任何更改都不会修改Camera.

如果您希望它是可修改的,则应将其更改为返回Vector&参考。

于 2013-01-20T08:19:10.217 回答