如何在数组上使用基本成员初始化?

时间:2013-05-18 20:46:35

标签: c++ initialization

进行二十一点游戏并需要知道如何使用基本成员初始化初始化数组(即使用一元范围解析运算符在构造函数中初始化)。

//Constructor
Card::Card()
:mRank(static_cast<Rank>(ACE)), mSuit(static_cast<Suit>(SPADES)), mRankText(), mSuitText()
{
}

我想将不规则数组mRankText和mSuitText初始化为

const char * rankText[NUMBER_OF_RANKS] = {"Ace", 
                                          "Deuce", 
                                          "Trey", 
                                          "Four", 
                                          "Five", 
                                          "Six", 
                                          "Seven", 
                                          "Eight", 
                                          "Nine", 
                                          "Ten", 
                                          "Jack", 
                                          "Queen", 
                                          "King"};

const char * suitText[NUMBER_OF_SUITS] = {"Spades", 
                                          "Clubs", 
                                          "Diamonds", 
                                          "Hearts"};

1 个答案:

答案 0 :(得分:3)

  

基本成员初始化(即使用一元范围解析运算符在构造函数中初始化)。

它被称为 ctor-initializer mem-initializer-list (或者只是一个“构造函数初始化列表”)并且没有“一元范围分辨率”这样的东西运算符“那叫做冒号!

在C ++ 11之前你不能这样做,你只能保持数组未初始化或将所有成员初始化为零(这正是你的代码现在正在做的。)

在C ++ 11中,您可以使用大括号进行统一初始化:

//Constructor
Card::Card()
: /*...*/, mRankText{ a, b, c }, mSuitText{ d, e, f, g }
{
}

这需要显式指定每个元素,要自动化它,您需要使用委托构造函数和可变参数模板。以下使用将在C ++ 14中的std::index_sequence类型,但您今天可以使用integer_seq.h实现来执行此操作:

//Constructor
Card::Card()
: Card(std::make_index_sequence<NUMBER_OF_RANKS>(),
       std::make_index_sequence<NUMBER_OF_SUITS>())
{ }

template<size_t... R, size_t... S>
Card::Card(std::index_sequence<R...>, std::index_sequence<S...>)
: /*...*/, mRankText{ rankText[R]... }, mSuitText{ suitText[I]... }
{
}