Использовать членов одного класса в другом классе (OOP) - PullRequest
0 голосов
/ 14 марта 2020

У меня есть два класса Инструктор и Игра.

Instructor.h

class Instructor
{
    int instrID;

public:
    Instructor();
    void showGameStatus();
    int createGame();                           
    vector<int> createGames(int numberOfGames); 
};

Game.h:

class Game {

private:                            
    int gID;                        
    int instrID;                    
    int pFactID;                    
public:

    Game() {                // default constructor
        gID = 0;
        instrID = 0;
        pFactID = 0;

    };

Это в Instructor. cpp

void Instructor::showGameStatus()
{

}

int Instructor::createGame()
{
    Game g;
}

CreateGame ( ) инициализирует игру. Я хочу, чтобы при вызове showGameStatus () я мог распечатать все свойства (например, gId, InstrId) игры g, которые были инициализированы ранее и т. Д. c.

Возможно ли получить доступ к свойствам игры g, которые в другой метод?

Ответы [ 3 ]

1 голос
/ 14 марта 2020

Это должно сделать это. Класс Instructor должен наследовать класс Game: class Instructor :: publi c Game { Ваш код здесь }

0 голосов
/ 15 марта 2020

Краткий ответ: Нет.

Более длинный ответ таков: если я правильно понимаю, что вы хотите сделать sh, проблема в том, что объект g типа Game удерживается локальной переменной внутри области вашей функции-члена Instructor::createGame. Как только эта функция «выполнена», то есть локальная область действия заканчивается, объект, имеющий automati c хранилище , будет уничтожен. Это прошло. Я не знаю, что означает int, что вы возвращаете, но независимо от того, что он делает, он не содержит объект типа Game.

Теперь вы , вероятно, хотите, чтобы ваш createGame возвращал некоторый тип дескриптора фактическому Game объекту. В зависимости от ваших настроек c, ваша задача - выбрать способ передачи такого объекта вокруг . Например, один из способов может быть таким:

Game Instructor::createGame() const { // 1
  Game g;
  // do stuff with g, perhaps?
  return g;
}

Другой может быть:

std::unique_ptr<Game> Instructor::createGame() const { // 2
  auto gptr = std::make_unique<Game>();
  // do stuff with gptr, perhaps?
  return gptr;
}

Или еще один:

std::size_t Instructor::createGame() { // 3
  // Instructor has a member std::vector<Game> games
  games.emplace_back();
  // do stuff with games.back()
  return games.size()-1;
}

Существует множество других способов передать объект.

Неважно, что вы выберете, у вас есть , чтобы передать что-то , чтобы определить , какой Game объект, о котором вы говорите вернуться к вашей функции showGameStatus, если вы планируете, чтобы вокруг нее летало более одного Game объекта (я полагаю, вы это делаете).

auto some_handle = instructor.createGame();
// ... later ...
instructor.showGameStatus(some_handle);

Все это верно, если Вы хотите более одного объекта . В противном случае вы можете просто добавить объект в качестве члена вашего Instructor типа:

class Instructor {
  private:
    Game game;
  public:
    Instructor() : game() {}
    // no createGame function, it is superfluous
    void showGameStatus() const {
      game.some_output_function();
    }
};
0 голосов
/ 14 марта 2020

Просто унаследуйте класс инструктора в классе игры и выполняйте свою работу ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...