Call member object from object, ERROR: initial value of reference to non-const must be an lvalue

Call member object from object, ERROR: initial value of reference to non-const must be an lvalue

我有 类 游戏、房间、宝箱和物品栏。

游戏包含一个 Room 对象和一个 doSomething() 函数。

Room 包含一个 Chest 对象向量、一个方法 addChest(将一个箱子添加到 chests 向量)和一个方法 getChest returns 从 chests 向量(给定索引)。

箱子包含一个库存对象。

还有一个 open() 函数,它通过引用将 Inventory 对象作为参数。

doSomething() 函数中,我将一个箱子添加到 room1 并调用 open() 函数,并将我刚刚添加的 room1 箱子的库存作为参数。

只写下面的代码会在 open(this->room1.getChest(0).inventory);

中出错
#include <vector>

using namespace std;

class Inventory {

};

class Chest {
public:
    Inventory inventory;
};

class Room {
    vector<Chest> chests;
public:
    Room();

    inline void addChest(Chest chest) { this->chests.push_back(chest); }
    inline Chest getChest(int index) { return this->chests[index]; }

};

class Game {
    Room room1;
public:
    void doSomething();
};

void open(Inventory &inventory) {
    //Inventory management
}

void Game::doSomething() {
    Chest chest;
    this->room1.addChest(chest);
    open(this->room1.getChest(0).inventory); //Error here: initial value of reference to non-const must be an lvalue
}

int main() {
    Game game;
    game.doSomething();

    return 0;
}

我不明白为什么会出现这个错误。但是,我知道如果我在 getChest() 中的 Chest 之后添加一个 &,错误就会消失。

原代码有什么问题? / 还有哪些其他修复方法?

What other ways of fixing it are there?

将打开方法的原型更改为:

void open(const Inventory &inventory)

或者将 getChest 方法更改为此,正如@1201ProgramAlarm 评论的那样:

Chest& getChest(int index)

这将引用存储在向量中的对象。

错误发生是因为程序员试图做的事情表明即将发生逻辑错误,因为该方法需要可变左值引用,但您传递的是临时对象。

中阅读更多内容

不是错误的原因,但这里有一个提示:

您不需要在代码中使用 this 指针。我建议您(再次)阅读有关 this 的内容。 When should I make explicit use of the `this` pointer?