1

我的游戏类由宇宙飞船组成。我将 Spaceship 对象设为私有,并为该对象做了一个吸气剂。

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

当我通过我的 getter 使用我的宇宙飞船对象时,它无法正常工作。如果我将其公开并仅按其名称使用它,它就可以工作。你知道是什么导致了这个问题吗?

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 按值返回。这意味着调用者获得了他们自己的 Spaceship实例,该实例是从mySpaceship.

正如 yattering 所说,如果您希望调用者使用相同的实例,则应该返回对该对象的引用。

现在,我希望看到的两种访问器方法是:

Spaceship const& getSpaceship() const { return mySpaceship; }
Spaceship&       getSpaceship()       { return mySpaceship; }

第一个返回对 const 的引用Spaceship:您不能通过此引用修改船,但多个调用者可以查看相同的状态,如果他们只有对游戏本身的 const 引用。

第二个返回Spaceship: 这是完全读写访问的引用,但是您需要对 Game 的非常量引用才能获取它。


如果有帮助,请考虑比宇宙飞船更简单的东西:

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

请注意,如果我首先只有一个 const 引用w,我可以调用两个 const 限定方法,但不能调用reference_to_value,因此 const 阻止我更改w.value.

于 2013-03-24T21:31:04.370 回答