为对象做一个吸气剂?

时间:2013-03-24 21:18:04

标签: c++

我的游戏课程由太空飞船组成。 我将Spaceship对象设为私有,并为此对象做了一个getter。

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

当我通过我的主要吸气器使用我的太空飞船物体时,它无法正常工作。如果我把它公之于众,只是按它的名字使用它,它就可以了。你知道可能导致这个问题的原因吗?

2 个答案:

答案 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 }}