1

私のゲームクラスは宇宙船で構成されています。Spaceshipオブジェクトをプライベートにし、このオブジェクトのゲッターを実行しました。

Spaceship Game::getSpaceShip() const
{
    return mySpaceship;
}

メインのゲッターを介して宇宙船オブジェクトを使用すると、正しく機能しません。公開して名前だけで使うとうまくいきます。何がこの問題を引き起こしているのか考えていますか?

4

2 に答える 2

5

mySpaceshipのコピーを返却します。mySpaceshipオブジェクトへのポインタを返してみてください。

Spaceship *Game::getSpaceShip()
{
    return &mySpaceship;
}

または参照:

const Spaceship& Game::getSpaceShip() const
{
    return mySpaceship;
}

Javaではありません。C ++では、変数を値で渡したり返したりしています。別の方法で(ポインターまたは参照によって)実行することを指定しない限り。

また、返された参照を変更する必要がある場合。

Spaceship& Game::getSpaceShip()
{
    return mySpaceship;
}
于 2013-03-24T21:24:06.383 に答える
4

あなたの方法

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

于 2013-03-24T21:31:04.370 に答える