【问题标题】:Class Initializer checking for certain input类初始化程序检查某些输入
【发布时间】:2018-10-24 12:18:49
【问题描述】:

我在头文件中有一个类,我正在尝试在给定特定输入的情况下实现初始化。 所以我的头文件不包括头文件看起来像这样:

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 是否匹配类中的一个变量,我是否需要单独检查每个变量,或者有没有更有效的方法?非常感谢您的帮助

【问题讨论】:

  • 初始化器是指构造器,对吗??
  • 附带说明一下,为什么您使用 C 风格的字符串而不是 std::string 作为等级和西装名称?
  • @Caw:当你在编译时知道字符串并且可以标记它constexpr时,为什么还要使用std::string

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


【解决方案1】:

或者有没有办法更有效地做到这一点?

是的,你可以爆炸新的 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}
{

}

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

【讨论】:

  • 请不要爆出 C++11 的特性,我们仍然需要它们! :(
  • 更严肃的一点是:请为您的类型和变量名称选择真实的单词,而不是一个字母的缩写。根本没有理由写Su 而不是SuiteK 而不是Card 等等。
  • @MaxLanghof hi max,谢谢你的评论......你知道,我试图尽快发布......当然我们需要为所有课程使用更具描述性的名称和它的成员... :)
【解决方案2】:

顺便说一句,我会再做两个职业,一个叫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;
}

也许用有效字符串初始化类中的字符串数组并循环遍历要测试的元素,或者像上面那样简单的暴力检查。

【讨论】:

  • 似乎是一种非常迂回的解决问题的方法,使用枚举会简单得多。
  • 我只是猜测他想继续在构造函数中使用字符串。
猜你喜欢
  • 2017-02-12
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2013-10-11
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多