Вызвать объект-член из объекта, ОШИБКА: начальное значение ссылки на неконстантное должно быть lvalue - PullRequest
2 голосов
/ 24 марта 2019

У меня есть классы Game, Room, Chest и Inventory.

Игра содержит объект Room и функцию doSomething().

Room содержит вектор объектов Chest, метод addChest (который добавляет сундук к вектору сундуков) и метод getChest, который возвращает сундук из вектора сундуков (с указанным индексом).

Сундук содержит объект инвентаря.

Также имеетсяopen() функция, принимающая в качестве аргумента объект инвентаризации по ссылке.

В функции doSomething() я добавляю сундук в комнату1 и вызываю функцию open() с аргументом как инвентарь из сундука комнаты1.только что добавленный.

Простое написание приведенного ниже кода приводит к ошибке в 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(), ошибка исчезнет.

Что не так с исходным кодом?/ Какие еще есть способы исправить это?

1 Ответ

2 голосов
/ 24 марта 2019

Какие есть другие способы исправить это?

Изменение прототипа метода open на:

void open(const Inventory &inventory)

Или изменение метода getChest наэто, как прокомментировал @ 1201ProgramAlarm:

Chest& getChest(int index)

, который будет ссылаться на объект, сохраненный в векторе.

Ошибка происходит потому, что попытка программиста указывает на наступающую логическую ошибку, так какметод ожидает непостоянную ссылку lvalue, но вы передаете временный объект.

Подробнее в Почему rvalue не может связываться с неконстантной ссылкой lvalue, за исключением того факта, что запись ввременное не имеет никакого эффекта?


Не причина ошибки, но вот вам совет:

Вам не нужно использовать указатель this вваш код.Я предлагаю вам прочитать о this (снова). Когда я должен явно использовать указатель `this`?

...