Проверка инициализатора класса для определенного ввода - PullRequest
0 голосов
/ 24 октября 2018

У меня есть класс в заголовочном файле, и я пытаюсь реализовать инициализацию с учетом определенного ввода.Итак, мой заголовочный файл, исключая заголовки, выглядит примерно так:

class Card {
public:
  // rank and suit names
  static constexpr const char* const RANK_TWO = "Two";
  static constexpr const char* const RANK_THREE = "Three";
  static constexpr const char* const RANK_FOUR = "Four";
  static constexpr const char* const RANK_FIVE = "Five";
  static constexpr const char* const RANK_SIX = "Six";
  static constexpr const char* const RANK_SEVEN = "Seven";
  static constexpr const char* const RANK_EIGHT = "Eight";
  static constexpr const char* const RANK_NINE = "Nine";
  static constexpr const char* const RANK_TEN = "Ten";

  static constexpr const char* const SUIT_SPADES = "Spades";
  static constexpr const char* const SUIT_HEARTS = "Hearts";
  static constexpr const char* const SUIT_CLUBS = "Clubs";
  static constexpr const char* const SUIT_DIAMONDS = "Diamonds";

Card();

Card(const std::string &rank_in, const std::string &suit_in);

private:
  std::string rank;
  std::string suit;
};

Для реализации второго инициализатора у меня пока есть это.

Card::Card(const std::string &rank_in, const std::string &suit_in){

    this->rank = rank_in;
    this->suit = suit_in;
}

Чтобы проверить, совпадают ли мои rank_in и suit_inодна из переменных внутри класса, мне нужно проверять каждую из них по отдельности или есть способ сделать это более эффективно?Заранее спасибо, помощь очень ценится

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Просто случайно, я бы сделал еще два класса, один называется Ранк, а другой - Костюм.Каждый из них должен иметь конструктор, который принимает строку, и функцию isValid ().Затем вы можете инициализировать ранг и масть в классе Карты, а затем проверить, действительны ли они, прежде чем что-либо предпринимать.Примерно так:

class Rank {
   public:
      Rank(std::string s) : mRank(s) { }
      bool isValid() const { /* check against all valid strings */ return true; }
   private:
      std::string mRank;
}

Возможно, инициализируйте строковый массив в классе допустимыми строками и проведите цикл по проверяемым элементам, или простую проверку грубой силы, как описано выше.

0 голосов
/ 24 октября 2018

или есть способ сделать это более эффективно?

да, вы можете взорвать новые функции c ++ 11:

class K 
{
    public:
        enum class R
        {
            TWO,
            THREE,
            FOUR
        };
        enum class Su
        {
            S,
            H,
            C,
            D
        };
        K(const R someR, const Su someSu);
    private:
        R r;
        Su su;
};
#endif /* K_H */

K::K(const R someR, const Su someSu): r{someR}, su{someSu}
{

}

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

...