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;

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

カメラ.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)

より良いアイデアは、ゲッターとセッターの使用を避けることです。

于 2013-01-20T08:18:50.020 に答える
1

ゲッターはオブジェクトCamera::get_location()を返しVectorます。これは、そのメンバー変数のコピーになります。Vectorしたがって、これを変更しても、 に含まれるは変更されませんCamera

これを変更可能にしたい場合は、Vector&参照を返すように変更する必要があります。

于 2013-01-20T08:19:10.217 に答える