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?
我有 类 游戏、房间、宝箱和物品栏。
游戏包含一个 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?