我的游戏课程由太空飞船组成。 我将Spaceship对象设为私有,并为此对象做了一个getter。
Spaceship Game::getSpaceShip() const
{
return mySpaceship;
}
当我通过我的主要吸气器使用我的太空飞船物体时,它无法正常工作。如果我把它公之于众,只是按它的名字使用它,它就可以了。你知道可能导致这个问题的原因吗?
答案 0 :(得分:4)
您正在返回mySpaceship副本。尝试返回指向mySpaceship对象的指针。
Spaceship *Game::getSpaceShip()
{
return &mySpaceship;
}
或参考:
const Spaceship& Game::getSpaceShip() const
{
return mySpaceship;
}
这不是Java。在C ++中,您按值传递和返回变量!除非您表明要以不同方式(通过指针或引用)执行此操作。
如果您需要修改返回的引用。
Spaceship& Game::getSpaceShip()
{
return mySpaceship;
}
答案 1 :(得分:3)
你的方法
Spaceship Game::getSpaceShip() const;
按值返回Spaceship
。这意味着调用者获取他们自己的 Spaceship
实例,该实例是从mySpaceship
初始化的。
正如yattering所说,如果你想让调用者使用相同的实例,你应该返回对象的引用。
现在,我期望看到的两种访问方法是:
Spaceship const& getSpaceship() const { return mySpaceship; }
Spaceship& getSpaceship() { return mySpaceship; }
第一个返回对const Spaceship
的引用:您不能通过此引用修改发货,但是如果多个调用者只有const,则可以查看相同的状态参考游戏本身。
第二个返回对Spaceship
的引用:这是完全读写访问,但你需要一个非const引用来获取它。
如果有帮助,请考虑比宇宙飞船更简单的东西:
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引用,我可以调用两个const限定的方法而不是reference_to_value
,所以const阻止我改变{{1 }}