从对象调用成员对象,错误:对非常量的引用的初始值必须为左值

时间:2019-03-24 18:34:50

标签: c++ class methods pass-by-reference derived-class

我有Game,Room,Left和Inventory类。

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

Room包含一个Chest对象的向量,一个方法addChest(将一个Chest添加到Chests向量)和一个方法getChest,该方法从Chests向量(给定的索引)中返回一个Chest。 >

胸部包含一个库存对象。

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

我不明白为什么会发生此错误。但是,我知道,如果我在&中的Chest之后添加getChest(),该错误就会消失。

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

1 个答案:

答案 0 :(得分:2)

  

还有哪些其他修复方法?

将open方法的原型更改为:

void open(const Inventory &inventory)

或将getChest方法更改为此,如@ 1201ProgramAlarm所述:

Chest& getChest(int index)

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

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

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指针。我建议您再读一次thisWhen should I make explicit use of the `this` pointer?