Невозможно изменить составные элементы данных класса - PullRequest
1 голос
/ 03 августа 2020

В моей программе есть 3 классы, которые взаимодействуют друг с другом и содержат экземпляры друг друга:

class Inventory 
{
public:
   // Increment Data Members
   void incrementHerbs() { herbs++; }
   void incrementHealth() { health++; }
   void incrementGold() { gold++; }

   // Getters
   int getHerbs() { return herbs; }
   int getHealth() { return health; }
   int getGold() { return gold; }

private:
   int herbs = 0;
   int health = 3;
   int gold = 0;
};

class Player 
{
public:
   void setRow(int row) { this->rowCoordinate = row; }
   void setCol(int col) { this->colCoordinate = col; }
   int getRow() { return rowCoordinate; }
   int getCol() { return colCoordinate; }
   Inventory getBag() { return Bag; }

private:
   int rowCoordinate;
   int colCoordinate;
   Inventory Bag;
};

class Board
{
public:
   int getNumRows() { return numRows; }
   int getNumCols() { return numCols; }
   Player getPlayer() { return User; }

private:
   int numRows;
   int numCols;
   char** maze;
   Player User;
};

Я только создаю экземпляр объекта Board в функции main. В какой-то момент в моей программе я хочу иметь возможность увеличивать счетчик herb в классе инвентаризации с помощью этого объекта.

Я пытался сделать:

Board board;
board.getPlayer().getBag().incrementHerbs();

Этот вызов компилируется без ошибок, но когда я потом распечатываю счетчик herb, счетчик herb остается прежним.

Он не увеличивался. Что может пойти не так и что мне делать?

1 Ответ

3 голосов
/ 03 августа 2020

Что может пойти не так и что я могу сделать?

В вашем классе Player функция getBag() возвращает копию Inventory (то есть член Bag).

Inventory getBag() { return Bag; }
//^^^^^^----> is copy!

Вам необходимо вернуть ссылку, чтобы изменить ее

Inventory& getBag() { return Bag; }
//^^^^^^^^

Та же проблема с функцией Board getPlayer()

Player getPlayer() { return User; }
//^^^^----> is copy!

нужно

Player& getPlayer() { return User; }
//^^^^^^

А вот и демо .

...