类初始化程序检查某些输入

时间:2018-10-24 12:18:49

标签: c++ class c++11 variables initialization

我在头文件中有一个类,并且在给定特定输入的情况下,我试图实现初始化。 因此,我的头文件(不包括头文件)看起来像这样:

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 :(得分:2)

  

还是有一种更有效的方法?

是的,您可以使用新的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}
{

}

通过这种方法,您可以通过在构造函数中混合参数的类型来避免类的用户犯错误...

答案 1 :(得分:1)

我只是临时开了两堂课,一个叫Rank,另一个叫suit。它们每个都应具有采用字符串和函数isValid()的构造函数。然后,您可以在Card类中初始化等级和西服,然后在继续进行任何操作之前检查它们是否有效。像这样:

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

也许可以使用有效的字符串在类中初始化一个字符串数组,然后遍历要测试的元素,或者像上面那样进行简单的蛮力检查。