私のゲームクラスは宇宙船で構成されています。Spaceshipオブジェクトをプライベートにし、このオブジェクトのゲッターを実行しました。
Spaceship Game::getSpaceShip() const
{
return mySpaceship;
}
メインのゲッターを介して宇宙船オブジェクトを使用すると、正しく機能しません。公開して名前だけで使うとうまくいきます。何がこの問題を引き起こしているのか考えていますか?
私のゲームクラスは宇宙船で構成されています。Spaceshipオブジェクトをプライベートにし、このオブジェクトのゲッターを実行しました。
Spaceship Game::getSpaceShip() const
{
return mySpaceship;
}
メインのゲッターを介して宇宙船オブジェクトを使用すると、正しく機能しません。公開して名前だけで使うとうまくいきます。何がこの問題を引き起こしているのか考えていますか?
mySpaceshipのコピーを返却します。mySpaceshipオブジェクトへのポインタを返してみてください。
Spaceship *Game::getSpaceShip()
{
return &mySpaceship;
}
または参照:
const Spaceship& Game::getSpaceShip() const
{
return mySpaceship;
}
Javaではありません。C ++では、変数を値で渡したり返したりしています。別の方法で(ポインターまたは参照によって)実行することを指定しない限り。
また、返された参照を変更する必要がある場合。
Spaceship& Game::getSpaceShip()
{
return mySpaceship;
}
あなたの方法
Spaceship Game::getSpaceShip() const;
Spaceship
by値を返します。これは、呼び出し元がから初期化された独自の Spaceship
インスタンスを取得することを意味しますmySpaceship
。
yatteringが言うように、呼び出し元が同じインスタンスを使用するようにしたい場合は、オブジェクトへの参照を返す必要があります。
さて、私が期待する2つのアクセサメソッドは次のとおりです。
Spaceship const& getSpaceship() const { return mySpaceship; }
Spaceship& getSpaceship() { return mySpaceship; }
1つ目は、constへの参照をSpaceship
返します。この参照を介して船を変更することはできませんが、ゲーム自体へのconst参照しかない場合、複数の呼び出し元が同じ状態を表示できます。
2番目はへの参照をSpaceship
返します:これは完全な読み取り/書き込みアクセスですが、それを取得するにはゲームへの非定数参照が必要です。
それが役立つ場合は、宇宙船よりも単純なものを検討してください。
class Wrapper {
int value;
public:
int copy_of_value() const { return value; }
int& reference_to_value() { return value; }
int const& const_reference_to_value() const { return value; }
};
さて、これらはすべて異なった振る舞いをします:
Wrapper w;
int i = w.copy_of_value();
i += 1; // changes i but not w.value
int& j = w.reference_to_value();
j += 1; // does change w.value
int const& k = w.const_reference_to_value();
k += 1; // won't even compile
w
そもそもconst参照しかない場合は、2つのconst修飾メソッドを呼び出すことはできますが、呼び出すことはできないreference_to_value
ため、constを使用するとを変更できませんw.value
。