gpt4 book ai didi

c++ - 从对象中调用成员对象,错误 : initial value of reference to non-const must be an lvalue

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:32 25 4
gpt4 key购买 nike

我有 Game、Room、Chest 和 Inventory 类。

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

Room 包含一个 Chest 对象 vector 、一个方法 addChest(将一个箱子添加到 chests vector ),以及一个从 chests vector 返回一个箱子的方法 getChest(给定索引)。

Chest 包含一个 Inventory 对象。

还有一个 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?

将 open 方法的原型(prototype)更改为:

void open(const Inventory &inventory)

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

Chest& getChest(int index)

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

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

阅读更多 Why can an rvalue not bind to a non-const lvalue reference, other than the fact that writing to a temporary has no effect?


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

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

关于c++ - 从对象中调用成员对象,错误 : initial value of reference to non-const must be an lvalue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55327148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com