为对象做getter

do a getter for an object?

本文关键字:getter 对象      更新时间:2023-10-16

我的游戏类是由一个宇宙飞船组成的。我把宇宙飞船对象设为私有并为这个对象设置了getter

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

当我在main中通过getter使用太空船对象时,它不能正常工作。如果我把它公开,只使用它的名字,它就能工作。你知道是什么导致了这个问题吗?

您正在返回我的太空船副本。尝试返回指向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的非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阻止我更改w.value