进行二十一点游戏并需要知道如何使用基本成员初始化初始化数组(即使用一元范围解析运算符在构造函数中初始化)。
//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"};
答案 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]... }
{
}