Функция класса с параметром того же типа, что и класс - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь написать шахматный движок на C ++. У меня есть класс gameState, в котором хранятся позиции, типы и цвета фигур, а также есть несколько функций для определения соответствующей информации о доске, например, проверяется ли данный король. Он также имеет функцию makeCopyOf(gameState g), которая копирует данные параметра в свои собственные.

Я пытаюсь написать функцию в gameState, которая проверяет наличие матов, и для этого я хотел бы скопируйте его данные в другой временный объект того же типа. Есть ли способ передать gameState в качестве параметра одной из своих функций? Что-то вроде this в JavaScript?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Звучит так, будто вы хотите написать Копировать конструктор

Это похоже на конструктор или инициализатор, но принимает тот же класс в качестве параметра и создает новый класс. Например, ваш может выглядеть примерно так:

class GameState {
  public:
    GameState(const GameState& g) {
      game_state_var_1 = g.game_state_var_1;
      game_state_var_2 = g.game_state_var_2;

      // ...
  }
};

Тогда на практике вы будете использовать это так:

GameState g = GameState();
GameState duplicate_g = GameState(g);

Стоит также отметить, что если вы приехали из JavaScript справочная информация очень важно знать, что JavaScript - это уникальный язык. Ни функционально, ни объектно-ориентировано, но притворяется, что оба. Прежде чем написать новую функцию в своем классе, уделите немного времени, чтобы увидеть, поддерживает ли C ++ переопределяющие операции, чтобы сделать это в первую очередь.

Например, вы описали свою функцию makeCopyOf(gameState g), которую вы написали для своего класса GameState , Но более идиоматическим c C ++ подходом было бы переопределить оператор = следующим образом:

class GameState {
  public:
    const GameState& operator=(const GameState& g) {
      game_state_var_1 = g.game_state_var_1;
      game_state_var_2 = g.game_state_var_2;

      // ....
      return *this;
    }
};

Это означает, что вы можете просто использовать оператор присваивания, чтобы установить значения вашего объекта GameState на значение еще один GameState объект, подобный этому:

GameState g1 = GameState(1);
GameState g2 = GameState(2);

g1 = g2;
// g1 now has the same data as g2

Надеюсь, это поможет, без какого-либо кода трудно напрямую ответить на ваш вопрос.

0 голосов
/ 06 апреля 2020

Я почти сразу после публикации понял, что могу просто использовать перегрузку функций для определения другого makeCopyOf () без каких-либо параметров. Похоже, это решило мою проблему.

...