我的游戏类由宇宙飞船组成。我将 Spaceship 对象设为私有,并为该对象做了一个吸气剂。
Spaceship Game::getSpaceShip() const
{
return mySpaceship;
}
当我通过我的 getter 使用我的宇宙飞船对象时,它无法正常工作。如果我将其公开并仅按其名称使用它,它就可以工作。你知道是什么导致了这个问题吗?
我的游戏类由宇宙飞船组成。我将 Spaceship 对象设为私有,并为该对象做了一个吸气剂。
Spaceship Game::getSpaceShip() const
{
return mySpaceship;
}
当我通过我的 getter 使用我的宇宙飞船对象时,它无法正常工作。如果我将其公开并仅按其名称使用它,它就可以工作。你知道是什么导致了这个问题吗?
您正在返回 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
按值返回。这意味着调用者获得了他们自己的 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
.