1

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

//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"};
4

1 回答 1

3

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

它被称为ctor-initializermem-initializer-list(或只是一个“构造函数初始化器列表”),并且没有所谓的“一元范围解析运算符”之类的东西称为冒号!

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

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

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

这需要显式指定每个元素,要使其自动化,您需要使用委托构造函数和可变参数模板。以下使用std::index_sequenceC++14 中的类型,但您现在可以使用我的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]... }
{
}
于 2013-05-18T20:51:08.540 回答